4

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に配置する必要があることはわかっています。なぜ、これが宣伝どおりに機能しないのか疑問に思っています。

4

2 に答える 2

3

MSDNから:

/Codebase : レジストリに Codebase エントリを作成します。Codebase エントリは、グローバル アセンブリ キャッシュにインストールされていないアセンブリのファイル パスを指定します。グローバル アセンブリ キャッシュに登録しているアセンブリを後でインストールする場合は、このオプションを指定しないでください。/codebase オプションで指定する assemblyFile 引数は、厳密な名前のアセンブリである必要があります。

宣伝どおりに機能しているようです。アセンブリを GAC に配置しない場合は、ファイルパスにアクセスできるように /codebase を使用する必要があります。

于 2008-10-28T08:58:46.337 に答える
2

目的を達成するには、.NET アセンブリと VB6_App.EXE (.NET アセンブリを参照) の両方に対して .manifest ファイルを作成する必要があると思います。Google で登録不要の COM を確認してください。

于 2008-10-28T09:16:08.750 に答える