少し変わった質問で、おそらくほとんどの人がやりたいこととは逆になっていますが、レガシー COM の問題を回避しようとしています。
2 つのコンポーネントがあり、どちらも実際には .NET アセンブリですが、歴史的な理由から、一方が他方を COM オブジェクトとしてロードしています (アセンブリは COM Interop に登録されています)。これは、プラグインがその COM ProgID によって識別されるプラグイン アーキテクチャであるため、プラグイン アセンブリを読み込むために取得する情報はこれだけです。
私が試した1つのテクニックは次のとおりです。
var objType = Type.GetTypeFromProgID("My.ProgId");
var objLateBound = Activator.CreateInstance(objType);
IMyInterface netAssembly;
try
{
netAssembly = (IMyAssembly)objLateBound;
}
catch (Exception)
{
netAssembly = null;
}
.NET インターフェイスへのキャストが成功すると、.NET アセンブリがあり、インターフェイスを介してアクセスできることがわかります。ただし、この手法は少しぎこちなく、特に 64 ビット システムでは COM 側で問題が発生します。可能であれば、COM オブジェクトをロードするのをやめて、プラグインを .NET アセンブリとして直接ロードしたいと思います。
しかし、私が続けなければならない唯一の情報は、プラグインの COM ProgID です。
では、 COM オブジェクトを作成せずに、COM ProgID から .NET アセンブリを読み込むにはどうすればよいでしょうか?