0

リフレクションを使用して、アプリケーション ドメインでデリゲートのインスタンスを作成するにはどうすればよいですか?

C# DLL を動的にロードする C++/CLI DLL があります。C# DLL はネットワーク共有に配置されているため、別の AppDomain に読み込みます (PermissionSet は PermissionState.Unrestricted です)。

これは、クラスを作成するときにうまく機能します。

AppDomain^ appDomain = AppDomain::CreateDomain( ... );
Object^ obj = appDomain->CreateInstanceAndUnwrap(
    assemblyName,
    "MyNamespace.MyClass",
    false, // ignoreCase
    BindingFlags::CreateInstance | BindingFlags::Public | BindingFlags::Instance,
    nullptr, // binder
    args, // constructor arguments
    nullptr, // culture
    nullptr); // activationAttributes

ただし、同じ方法でデリゲートを作成する場合:

array<Object^>^ args = gcnew array<Object^>(1);
args[0] = MyFunctionThatIWantTheDelegateToWrap;
Object^ obj = appDomain->CreateInstanceAndUnwrap(
    assemblyName,
    "MyNamespace.MyDelegate",
    false, // ignoreCase
    BindingFlags::CreateInstance | BindingFlags::Public | BindingFlags::Instance,
    nullptr, // binder
    args, // constructor arguments
    nullptr, // culture
    nullptr); // activationAttributes

エラーが発生します:

未処理の例外: System.MissingMethodException: 型 'MyNamespace.MyDelegate' のコンストラクターが見つかりません。

したがって、を使用してデリゲートのインスタンスを作成できないと思いますCreateInstanceAndUnwrap()。だから私の質問は、どうやって作成するのですか?

ご参考までに、デリゲートの定義を次に示します。

namespace MyNamespace
{
    public delegate string MyDelegate(int fieldId, int size);
}
4

1 に答える 1

0

AppDomain.DoCallBackメソッドを見てください。実際のメソッドで使用されるタイプに注意してください。他のアセンブリを手動でロードするか、他のAppDomainのベースディレクトリプライベートビンパスをメインのパスと同じに設定する必要がある場合があります。

于 2012-12-03T11:16:13.510 に答える