質問
同じC#.NETプロジェクトの複数のバージョンを展開する必要があります。プロジェクト出力は、ネイティブアプリケーションで使用されるCOM Interopアセンブリです。私が抱えている問題は、このアセンブリのいくつかのバージョンを並べて展開しなければならないことですが、私がしていることは何でも異なるバージョンを作成していないようです。代わりに、バージョンはお互いをオーバーライドします。
アセンブリGUIDを変更して、アセンブリバージョン番号の変更を試み、アセンブリの強い名前キーを再生し、アセンブリタイトルと説明を変更しようとしました。バージョン化のために、アセンブリの個々のタイプのGUIDまたは名前を変更する必要はありません。
これらのバージョンがお互いにオーバーライドしないようにし、それらを並べて見て展開できるようにするにはどうすればよいですか?
前もって感謝します!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace InteropTest
{
[Guid("...")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Test
{
public Test()
{
}
public string Version
{
get
{
return "1.0";
}
}
}
}
解決
バージョン化のために、アセンブリの個々のタイプのGUIDまたは名前を変更する必要はありません。
でもあの まさに COMタイプが互いに干渉するのを防ぐためにあなたがしなければならないこと。 [GUID]は、COMクラスが登録されているHKLM Software classes clsidのレジストリキーを選択するために使用されます。同じGUIDを持つ2つの異なるバージョンは、お互いのキーを上書きします。 DLL Hellとしても知られています。パブリックインターフェイスの変更 必要 古いものを使用するクライアントを確実に保証するための新しいガイドは、不正行為を診断することが不可能で死ぬことはありません。ロックハードCOM要件。
GUID]属性を省略することは非常に可能です。CLRに任せて、それを生成するためにCLRに任せます。アセンブリ属性が役割を果たし始め、GUID値は、インターフェイスとその引数のメソッドのセットだけでなく、アセンブリ名とバージョンを含む滑らかなアルゴリズムによって自動生成されます。したがって、それを保証します どれか 変更は、自動的に異なるガイドを生成します。そして、予想され、必要に応じて、別の[アセンブリバージョン]が別の[GUID]を生成します。
別のアプローチは、あなたが「並んで」と思っていたと思っていたことです。 いいえ アセンブリを登録しますが、代わりにマニフェストに依存します。クライアントプログラムに埋め込む必要があります。 <clrClass>
comvisible]クラスを宣言する要素。バージョン化は展開の詳細になりました。 MSDNハウツー ここにある. 。に埋め込まなければならないことに留意してください クライアント プログラム、[comvisible]アセンブリではありません。それは問題になる傾向があります。
他のヒント
可能であれば、ネイティブアプリケーションのInteropアセンブリに遅れてバインディングしてみてください。また、AutoDualを使用してインターフェイスを自動生成し、代わりに独自の読み取りを明示的に生成することをお勧めします これ 詳細については。 Regeditを開き、GUIDとProGIDを検索して、どのバージョンのアセンブリが登録されているかを確認することで、問題をトラブルシューティングできます。