VB6からの.NETアセンブリを、GACに配置せずに、またregasm.exeの/ codebase引数を使用せずに、相互運用機能を介して使用しようとしています。
私が理解していることから、.NETクラスライブラリでregasm.exeを実行すると、クラスライブラリ内の各クラスのレジストリエントリが作成され、COMクライアントに.NETオブジェクトをラップするプロキシとして機能するmscoree.dllをロードするように指示されます。 COMの使用。Mscoree.dllは、クラスのレジストリ内のInprocServer32 / Assemblyキーを使用して、クラスの実装が含まれているクラスライブラリを判別します。
regasm.exeで/codebaseを使用するか、クラスライブラリをGACに配置すると、すべてが正常に機能します。しかし、散在するドキュメントから理解できる限り、mscoree.dllは、現在のディレクトリと、/ codebaseが使用されていない場合はパスでアセンブリを探す必要があります(したがって、レジストリにCodeBaseエントリがありません。クラス)そしてそれはGACでそれを見つけることができません。
C#コードは、次のように単純です。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace myinterop
{
[Guid("B1D6B9FE-A4C7-11DD-B06B-E93056D89593")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyServer
{
public int Add(int a, int b)
{
return a + b;
}
}
}
そして、問題は、コンパイルされたDLLと同じディレクトリに置いたVBScript1ライナーで再現されます。
object = CreateObject("myinterop.MyServer")
ここで何が欠けていますか?mscoree.dllがどこかでアセンブリを検索する方法の明確な説明はありますか?
ところで、私は.NET 2.0を使用していますが、そうです、アセンブリをGACに配置する必要があることはわかっています。なぜ、これが宣伝どおりに機能しないのか疑問に思っています。