![](/img/trans.png)
[英]Exception Info: System.AccessViolationException when calling C++ Dll
[英].NET Unhandled exception of type 'System.AccessViolationException' occurs when calling function from a C++ CLR DLL
我有一个使用类的托管C ++ DLL(CLR)的C#应用程序(我们将其称为ManagedProcessor
类)。 当我要创建此类的对象时,我从Visual Studio收到以下消息:
Main.exe中发生了类型为'System.AccessViolationException'的未处理异常。
附加信息:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。
如果我从命令行执行应用程序,则收到的信息甚至更少,仅仅是“未处理的异常”。
这是一个简单的示例:
class Program
{
static void CallDLLFunction()
{
try
{
ManagedProcessor proc = new ManagedProcessor("C:/SomeFolder");
}
catch (System.Exception e)
{
System.Console.WriteLine("Encountered exception: {0}...", e.Message);
}
}
static void Main(string[] args)
{
System.Console.WriteLine("Before calling DLL Function");
CallDLLFunction();
System.Console.WriteLine("Before calling DLL Function");
}
}
}
// ManagedProcessor.h
public ref class ManagedProcessor
{
public:
ManagedProcessor(System::String ^folder);
void doSomething();
private:
bool mFlag;
};
我已经包含了DLL的所有必需依赖项,但它仍然给我这个错误。 仅供参考,目标.NET平台是4.0,程序集是x64。 此外,DLL还具有对某些本机C ++代码的引用。
仅当我们将代码库从Visual Studio 2008迁移到2010并使用CMake生成VS 2010项目时才出现此问题(我确保generate 2010项目的设置与2008版本完全相同)。
我真的希望对此问题有所帮助。 提前致谢。
我只需从C ++ / CLI项目的链接器输入中删除Boost线程库就可以解决我的问题。 由于某种原因,该特定的库在运行时导致某种内存损坏/访问冲突(或不确定的运行时混合)。 据我所知,该库是为VS 2010构建的,但我没有生成它,因此无法保证100%的保证。 它是传递依赖,意味着它被CMake包含,因为它是我项目的直接引用库之一所包含的引用(默认CMake行为)。 我通过将PRIVATE关键字添加到target_link_libraries CMake命令并瞧瞧,更改了相关项目的CMakeLists.txt文件,以使其不包含在C ++ / CLI项目中:
target_link_libraries(DependentTarget PRIVATE ${REQUIRED_LIBS})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.