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

前端之家收集整理的这篇文章主要介绍了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;
    }
}

猜你在找的C#相关文章