这发生在包含您的代码段的方法是 JIT 编译的时候。为了进行 JIT 编译,该方法需要在调用该方法时可用。由于该方法不可用,因此当调用包含此代码的方法时,甚至在该方法执行之前,JIT 编译器会抛出此异常。
解决这个问题的一种方法是定义一个新方法:
int[] HideCall()
{
return DLL.CallNewMethod();
}
然后调用这个方法而不是DLL.CallNewMethod()
直接调用。
更好的解决方案是在程序集中定义一个接口,该接口由您的“条件 DLL”和您有条件地使用此 DLL 的程序集引用。在主程序集中提供此接口的默认实现,并在有条件使用的 DLL 中提供替代实现。
然后,在运行时,您可以简单地查看 DLL 是否可用,使用反射构造实现此接口的类的实例,然后用这个替换对默认实现的引用。
示例代码:
// Interface, in an assembly visible to both of the other assemblies.
public interface IDLLInterface
{
int[] CallNewMethod();
}
// Implementation in the main program.
class DefaultDLLImplementation : IDLLInterface
{
public int[] CallNewMethod()
{
return new int[5];
}
}
static class DLLImplementation
{
public readonly IDLLInterface Instance;
static DLLImplementation()
{
// Pseudo-code
if (DllIsAvailable) {
Instance = ConstructInstanceFromDllUsingReflection();
} else {
Instance = new DefaultDLLImplementation();
}
}
}
然后你可以DLLImplementation.Instance.CallNewMethod()
改用,正确的方法会被自动调用。
当然,我建议使用更具描述性的名称来命名您的界面,以便清楚其含义。