我有一个C#应用程序,它使用类的托管C ++ DLL(CLR)(让我们调用类ManagedProcessor
)。当我要创建此类的对象时,我从Visual Studio收到以下消息:
“System.AccessViolationException”类型的未处理异常 发生在Main.exe。
附加信息:尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。
如果我从命令行执行应用程序,我会收到更少的信息,只是“未处理的异常”。
以下是一个如何调用它的简单示例:
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项目时(我确保生成的2010项目具有与2008版本完全相同的设置)。
我真的很想帮助解决这个问题。提前谢谢。
答案 0 :(得分:1)
我能够通过从C ++ / CLI项目的链接器输入中删除Boost线程库来解决我的问题。出于某种原因,该特定库在运行时导致某种内存损坏/访问冲突(或混合运行时,不确定)。据我所知,该库是为VS 2010构建的,但我没有生成它,所以我无法用100%的保证确认。它是一个传递依赖,意味着它被CMake包含,因为它是我的项目的一个直接引用的库包含的引用(默认CMake行为)。我更改了依赖项目的CMakeLists.txt文件,以便通过在target_link_libraries CMake命令中添加 PRIVATE 关键字来将其依赖项包含在C ++ / CLI项目中,并且瞧:
target_link_libraries(DependentTarget PRIVATE ${REQUIRED_LIBS})