2009-09-25 21 views
6

私は別のプロジェクト(projA)で作られたアセンブリを持っています。今私は別のプロジェクト(projB)でこのDLLをインポートしたいと思います。どうすればこれを達成できますか?これは私が試したことです(projBで)。私のプロジェクトと同じディレクトリにあるASP.NET web.configにアセンブリを追加する方法は?

1プットのdll。 (ビンDIR)

web.configファイルで

2:

<assemblies> 
    <add assembly="projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
</assemblies> 

は、これは私が取得エラーです:

は、ファイルまたはアセンブリをロードできませんでした「projA、バージョン= 1.0.0.0は、文化=中立、PublicKeyToken = 31bf3856ad364e35 'またはその依存関係の1つ。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

EDIT:

点は、最終的にアセンブリ参照私が動的

EDIT 2を加えなければならないということである。

アセンブリ(および名前空間)の名前でありますデータベースに格納される。物理アセンブリ(dll)がprojBに(インストールによって)追加されます。 projBのコードでは、データベースからアセンブリ名を読み取り、インストールによって追加されたdllへの参照を追加する必要があります。

+0

私の心に質問する。 –

答えて

7

projBのすべてがprojBに依存していますか?私は同じソリューションにある場合、通常、私はちょうど1つのプロジェクトから別の参照を追加したいと思います。

編集:

あなたは多分、動的に、サービス参照をアセンブリを追加したい場合は、多分何かが検討します。 projAのDLLを本当に必要なすべてのDLLを提供しないbinにダンプすることで、XMLを使って共通の例を与えるWebサービスのように、システム間でオブジェクトを理解できるようにする方法があります。バック動的にアセンブリを追加する方法について

私の質問はあなたからそれを得るだろうし、その部分はそれが本当にこの種の問題の一般解であるようprojBの一部であることを自動化することができる場所です。

編集2:

どのようにprojAの依存関係をすべて取得できますか?これは、これが実行されるシステム上にあるかもしれないし、ないかもしれない他のDLLの束に依存しないようにすることも可能ですか?それが、エラーがあなたに伝えていることです。必要とされるアセンブリプロジェクトがいくつか存在します。多くの依存性レベルが使用されている場合、このアセンブリの追加は長時間継続できます。答えをまとめる

:あなたは、いくつかの新しいプロジェクトにprojAをロードするために参照するためには何が必要でしょうか?依存関係がどのように見えるかを知らなくても、直接答えにくいのはあなたの問題です。

+0

最終的にアセンブリ参照を動的に追加する必要があります。 – Martijn

+0

私の投稿を編集したので、とても混乱して申し訳ありません。うまくいけば、これはもっと明確になります。 – Martijn

4

あなたは、アセンブリDLLがBinフォルダにある場合、Web.configファイルには何も追加する必要はありません - あなたはGACにあるアセンブリを参照している場合にのみこれを実行する必要があります。あなたが取得している

エラーメッセージは基本的にはそれがないのでおそらくある、アセンブリがGACに見つからないことを言っています!

+1

GACに行く前に、アセンブリローダーはまずローカル/ binフォルダー、/ bin /とアセンブリ名、フレームワークフォルダーなどのさまざまな組み合わせを探します。 –

+0

スタートページの私の編集を参照 – Martijn

3

手動でweb.configファイルで参照を追加する必要はありません。Visual Studioのソリューションエクスプローラウィンドウでプロジェクトを右クリックし、[参照の追加]を選択します。 [参照]タブに移動し、他のプロジェクトで作成したDLLを探して選択し、[OK]をクリックします。必要に応じて、プロジェクトAをプロジェクトBと同じソリューションに追加し、[参照の追加]ウィンドウの[プロジェクト]タブで参照を追加することができます。

+0

スタートページの私の編集を参照してください – Martijn

0

エラー

位置アセンブリのマニフェスト 定義は、アセンブリに 基準と一致しません。

は、DLLが見つかりましたが、バージョンまたは公開キーと一致していないことを示しています。 アセンブリの参照がバージョン情報と一致することを確認することをお勧めします。古いバージョン番号を持つ不正なDLLは/ binパスまたはGACにありません。

0

まあ、アセンブリを読み込んだら、アセンブリに何が入っているのかを計画しています。

私はあなたにプラグインのアーキテクチャを持っていると仮定します。既知のインタフェースや基本クラスを使ってメソッドを呼び出すと、IPluginが呼び出されます。したがって、このような"projA.PluginClass, projA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"負荷として文字列を取る

private IPlugin LoadPlugin(string fullTypeName) { 
    Type type = Type.GetType(fullTypeName, false, true); 

    Object plugin = Activator.CreateInstance(type); 

    if (plugin is IPlugin) { 
    return (IPlugin) plugin; 
    } 

    // Handle the fact you've not got what you expected however you like 
    throw new ApplicationException(error); 
} 

とにかく、ここでconfigセクションまたはどこかDBの列のいずれかで、それへの参照を保存するに基づいて、動的にアセンブリをロードする方法です組み立て、そしてあなたが興味を持っているクラスのインスタンスを返す

あなたは、このようにそれを使用します。あなたの編集は一転

// Call to DB to get details of class and assembly 
string pluginClass = GetPluginDetails(); 

IPlugin plugin = LoadPlugin(pluginClass); 

// Call known method to do something on IPlugin 
plugin.SomeMethod(); 
関連する問題