2009-06-22 10 views
1

私はOSの展開とカタログファイルへのアクセスに使用されるMicrosoft DLL(Microsoft.ComponentStudio.ComponentPlatformImplementation.dll)を使用するアプリケーションを持っています。バージョン6.0.0.0は、Windows Server 2008のカタログファイルに固有です。新しいバージョン6.1.0.0は、Windows Server 2008 R2のカタログファイルに固有です。不正なバージョンのカタログファイルにアクセスしようとすると、例外が発生します。複数のDLLバージョンに対応する

私のアプリケーション(VS.NETを使用しているVB.NET)は、これらのカタログのいずれかのバージョンにアクセスできる必要があります - 私は2つの実行可能ファイル(各カタログバージョンごとに1つ)に満足していますが、それぞれのソースコードのセット。

DLLの名前が同一であるため、プロジェクト参照で両方のDLLセットを指定することはできません。むしろ手動でDLLの参照を追加したり削除したりする必要はありません。私が知っている限り、インターフェイスなどは2つの間で事実上同じです。

私はここや他の箇所でbindingRedirect、Assembly.Loadなどについていくつかの記事を読んだことがありますが、何も実を結びつけていないようです。

答えて

0

Assembly.Loadは正常に動作するはずです。 AssemblyName、または文字列バリアントが必要なバリアントを使用しますが、完全なアセンブリ名を文字列として指定してください(例: "Microsoft.ComponentStudio.ComponentPlatformImplementation、Version = 6.1.0.0、Culture = findout、PublicKeyToken = findout")。実際に両方のDLLを同時にロードできることを確認してください。

その後、.GetExportedTypes()を使用して、後続の特定のAPIを呼び出します。

+0

返信いただきありがとうございます。しかし私のレベルの専門知識は、私を前進させるには十分ではありません。 Assembly.Loadを使用する場合、プロジェクトの参照にDLLを指定する必要がありますか?もしそうなら、通常のエラーメッセージを出さずに同じDLLの複数のバージョンをどのように組み込むのですか? Assembly.Load関数でDLLへのパスを指定する方法がない場合は、 また、アセンブリを使用しています。ロードしても、これらのアセンブリでIntellisenseを使用できますか? ありがとう! –

+0

いいえ、参照にライブラリを指定していません。すべての静的ランタイムサポートはなくなりました。DLLからの型の変数をもう宣言することはできませんし、Intellisenseを使用することはできません。指定されたパスからアセンブリをロードする方法については、KB 837908を参照してください。 –

+0

Martin、ご協力いただきありがとうございます。私は最終的に、Assembly.Loadなどで混乱する必要のないソリューションを見つけました。 乾杯、 ShadeSeeker。 –

0

私は解決策を自分で見つけました。誰かに役立つように、ここに投稿します。

ソリューションでは、CPI DLLの各バージョンのラッパークラスを作成する必要がありました。各ラッパークラスは独自のプロジェクトに存在するので、各CPI DLLの参照とDLLのコピーをプロジェクトに追加できます。私はCPIから必要なデータなどにアクセスするためのメソッドを追加する必要があるため、CPIアセンブリ内のクラスなどは完全に隠されています。 CPI DLLのコピーは、メインプロジェクトのbin \ Debugおよびbin \ Releaseフォルダの下のフォルダにも配置されます。私はapp.configを使用して、コンパイラがそれらを見つけることができるようにします。これにより、DLLがDebug \ Releaseにコピーされ、互いに上書きされなくなります。 は、ここではapp.configの関連部分です:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="Microsoft.ComponentStudio.ComponentPlatformInterface" 
         publicKeyToken="31bf3856ad364e35" 
         culture="neutral" /> 
    <codeBase version="6.0.0.0" 
       href="../CPIv6000Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/> 
    <codeBase version="6.1.0.0" 
       href="../CPIv6100Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/> 
    </dependentAssembly> 
</assemblyBinding> 

CPIのDLLの複数のコピーを持つことは、おそらく、得策不要と無粋であり、私はこれにさらに見ていきます - これはちょうど私のPoCですこの時点での解決策です。

CPIに複数のDLLがありますが、テストでは、このプライマリDLLをapp.configで参照する必要があることが示唆されています。

よろしく、ShadeSeeker。

関連する問題