我有一个非托管 c++ DLL,它通过托管 c++ 包装器调用 c# 代码。非托管 c++ DLL 是某些应用程序的插件(不在我的控制范围内)。当此应用程序调用非托管 c++ DLL 时,一切正常,直到托管 c++ 代码尝试使用 c# 代码。然后它崩溃了。
我编写了一个测试应用程序,它与应用程序做同样的事情,即它调用非托管 c++ DLL。这工作正常。
代码尽可能简单:
非托管 C++:
extern "C" __declspec(dllexport) void UnmanagedMethodCalledUponByApplication()
{
new Bridge();
}
托管 C++:
Bridge::Brigde()
{
gcnew Managed(); // This line crashes
}
C#:
public class Managed
{
}
我试图在有问题的行周围添加一个 try-catch (...) 块,但它没有捕获错误。
如果我gcnew Managed();
用它替换这条线MessageBox::Show("Alive!");
就可以了。所以我的猜测是我的 c# 项目设置有问题。
我试图用不同的平台(任何 CPU 和 x86)编译它。我试图改变目标框架。我试图调用静态方法Managed
而不是使用gcnew
. 还在崩溃。
任何想法可能是什么问题?
更新:
在评论和回答中提出建议后,我附上了调试器。现在我看到有人System.IO.FileNotFoundException
说找不到托管 DLL(或其依赖项之一)。
这里有一个猜测:这些 DLL 放在一起,但它们不在当前目录中。非托管 c++ DLL 被正确加载,因为主应用程序指定了它的路径。托管 c++ 实际上是一个库,因此代码也可以正常工作。但是,当托管 c++ 尝试加载 c# DLL 时,它会在错误的目录中查找它。
更新:
解决此问题的方法是使用反射动态加载 c# DLL。