2

少し変わった質問で、おそらくほとんどの人がやりたいこととは逆になっていますが、レガシー 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 アセンブリを読み込むにはどうすればよいでしょうか?

4

1 に答える 1

4

レジストリを検索して、所有している ProgID に関連付けられている DLL を見つけます。フル パスを取得したら、通常の .NET アセンブリとして読み込みます。

var type = Type.GetTypeFromProgID("My.ProgId", true);
var regPath = string.Format(@"{0}\CLSID\{1:B}\InProcServer32", 
    Registry.ClassesRoot, type.GUID);
var assemblyPath = Registry.GetValue(regPath, "", null);
if (!string.IsNullOrEmpty(assemblyPath))
{
    var assembly = Assembly.LoadFrom(assemblyPath);
    // Use it as a normal .NET assembly
}
于 2009-10-21T13:28:12.040 に答える