在AppDomain中创建委托

时间:2012-11-28 15:12:20

标签: c# reflection delegates c++-cli appdomain

如何使用反射在应用程序域中创建委托实例?

我有一个C ++ / CLI DLL,我可以从中动态加载C#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);
}

1 个答案:

答案 0 :(得分:0)

查看AppDomain.DoCallBack方法。注意实际方法中使用的类型。您可能需要手动加载其他程序集,或将其他AppDomain的base direcoryprivate bin path设置为与您的主程序集相同。