我正在开发一个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); } }
解决方法
您需要将一个有效的函数(由动态加载的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; } }