.NET Interop:現在のディレクトリでのアセンブリの使用
-
04-07-2019 - |
質問
GACに配置せず、regasm.exeの/ codebase引数を使用せずに、相互運用機能を介してVB6から.NETアセンブリを使用しようとしています。
.NETクラスライブラリでregasm.exeを実行すると、クラスライブラリ内の各クラスにレジストリエントリが作成され、プロキシラッピングとして機能するmscoree.dllをロードする必要があることをCOMクライアントに伝えます。 COM用のNETオブジェクト。 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と同じディレクトリに配置したVBScriptワンライナーで問題が再現します。
object = CreateObject("myinterop.MyServer")
ここで何が欠けていますか? mscoree.dllがアセンブリをどこで検索するかについての明確な説明はありますか?
ところで、.NET 2.0を使用していますが、はい、アセンブリをGACに配置する必要があることはわかっていますが、なぜこれが宣伝どおりに機能しないのか疑問に思っています。
解決
MSDN から:
>/ Codebase :コードベースエントリを作成します レジストリ。コードベースエントリは指定します アセンブリのファイルパス グローバルアセンブリにインストールされていません キャッシュ。これは指定しないでください 後でする場合のオプション あなたがいるアセンブリをインストールする グローバルアセンブリへの登録 キャッシュ。 assemblyFile引数は / codebaseオプションで指定します 厳密な名前のアセンブリである必要があります。
広告どおりに機能するようです。アセンブリをGACに配置しない場合は、ファイルパスにアクセスできるように/ codebaseを使用する必要があります。
他のヒント
目的を達成するには、.NETアセンブリとVB6_App.EXE(.NETアセンブリを参照)の両方に対して.manifestファイルを作成する必要があると思います。 Googleで登録不要のCOMを確認してください。