【问题标题】:Create a delegate in an AppDomain在 AppDomain 中创建委托
【发布时间】:2012-11-28 15:12:19
【问题描述】:

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

我有一个 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);
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2012-02-03
      • 2011-05-09
      • 2011-01-01
      • 2012-10-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多