c# – 委托给一个实例方法不能有null’this’

我正在开发一个C#.NET 2.0应用程序,其中在运行时,根据环境加载两个DLL之一.两个DLL都包含相同的功能,但它们没有链接到相同的地址偏移量.我的问题是在我的应用程序代码中的函数代理.
public class MyClass
{
    public delegate int MyFunctionDelegate(int _some,string _args);

    public MyFunctionDelegate MyFuncToCallFrmApp;

    public MyClass() : base()
    {
        this.MyFuncToCallFrmApp = new MyFunctionDelegate(this.MyFuncToCallFrmApp); // <-- Exception thrown here.
    }

    public SomeFunction()
    {
        MyFuncToCallFrmApp(int _someOther,string _argsLocal);
    }
}

当我的代码执行时,我得到一个ArgumentException“代理到一个实例方法不能为空”这个’.我究竟做错了什么?

解决方法

您需要将一个有效的函数(由动态加载的DLL中的某些类托管)分配给您的委托变量.如果这些函数是具有相同名称的类的静态方法,这是很简单的:
public MyClass() {
    this.MyFuncToCallFrmApp = ExternalClass.Function;
}

如果函数是具有相同名称的类的实例方法,只需创建一个实例并执行相同的操作(还要注意,只要委托在范围内,它将阻止ExternalClass实例被垃圾回收 – 您可能想要将实例存储为成员变量以使其更清晰):

public MyClass() {
    this.MyFuncToCallFrmApp = new ExternalClass().Function;
}

如果动态加载的类具有不同的名称,则需要确定要调用哪个类 – 在本示例中,我使用一个布尔成员变量来决定是否使用默认程序集的类:

public MyClass() {
    if (this.defaultAssembly) {
        this.MyFuncToCallFrmApp = ExternalClass1.Function;
    } else {
        this.MyFuncToCallFrmApp = ExternalClass2.Function;
    }
}

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...