加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:39:25 所属栏目:百科 来源:网络整理
导读:我正在开发一个C#.NET 2.0应用程序,其中在运行时,根据环境加载两个DLL之一.两个DLL都包含相同的功能,但它们没有链接到相同的地址偏移量.我的问题是在我的应用程序代码中的函数代理. public class MyClass{ public delegate int MyFunctionDelegate(int _some
我正在开发一个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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读