gpt4 book ai didi

c# - 委托(delegate)给实例方法不能有 null 'this'

转载 作者:可可西里 更新时间:2023-11-01 08:52:49 24 4
gpt4 key购买 nike

我正在开发一个 C# .NET 2.0 应用程序,其中在运行时根据环境加载两个 DLL 之一。两个 DLL 包含相同的函数,但它们没有链接到相同的地址偏移量。我的问题是关于我的应用程序代码中的函数委托(delegate)。

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 “Delegate to an instance method cannot have null 'this'.”我做错了什么?

最佳答案

您需要为您的委托(delegate)变量分配一个有效函数(由动态加载的 dll 中的某个类托管)。如果函数是具有相同名称 的类的静态方法,这很简单:

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

如果函数是同名类的实例方法,只需创建一个实例并做同样的事情(还要注意,只要委托(delegate)在范围内,它就会阻止 ExternalClass被垃圾收集的实例 - 您可能希望将实例存储为成员变量以使其更清晰):

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

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

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

关于c# - 委托(delegate)给实例方法不能有 null 'this',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3752824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com