从 C++ CLR DLL 调用函数时发生类型 'System.AccessViolationException' 的 .NET 未处理异常
.NET Unhandled exception of type 'System.AccessViolationException' occurs when calling function from a C++ CLR DLL
我有一个 C# 应用程序,它使用 class 的托管 C++ DLL (CLR)(我们称其为 class ManagedProcessor
)。当我要创建此 class 的对象时,我从 Visual Studio 收到以下消息:
An unhandled exception of type 'System.AccessViolationException'
occurred in Main.exe.
Additional information: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
如果我从命令行执行应用程序,我收到的信息更少,只是 "Unhandled Exception."
这里有一个简单的例子来说明它是如何被调用的:
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 版本完全相同的设置).
我真的很想得到一些帮助来解决这个问题。提前致谢。
我能够通过简单地从我的 C++/CLI 项目的链接器输入中删除 Boost 线程库来解决我的问题。出于某种原因,该特定库在运行时(或混合运行时,不确定)导致某种内存损坏/访问冲突。据我所知,该库是为 VS 2010 构建的,但我没有生成它,所以我不能 100% 确定这一点。它是一种传递依赖性,这意味着它被 CMake 包含,因为它是我项目的直接引用库之一包含的引用(默认 CMake 行为)。我更改了依赖项目的 CMakeLists.txt 文件,通过将 PRIVATE 关键字添加到 target_link_libraries CMake,使其依赖项不包含在 C++/CLI 项目中命令和瞧:
target_link_libraries(DependentTarget PRIVATE ${REQUIRED_LIBS})
我有一个 C# 应用程序,它使用 class 的托管 C++ DLL (CLR)(我们称其为 class ManagedProcessor
)。当我要创建此 class 的对象时,我从 Visual Studio 收到以下消息:
An unhandled exception of type 'System.AccessViolationException' occurred in Main.exe.
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
如果我从命令行执行应用程序,我收到的信息更少,只是 "Unhandled Exception."
这里有一个简单的例子来说明它是如何被调用的:
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 版本完全相同的设置).
我真的很想得到一些帮助来解决这个问题。提前致谢。
我能够通过简单地从我的 C++/CLI 项目的链接器输入中删除 Boost 线程库来解决我的问题。出于某种原因,该特定库在运行时(或混合运行时,不确定)导致某种内存损坏/访问冲突。据我所知,该库是为 VS 2010 构建的,但我没有生成它,所以我不能 100% 确定这一点。它是一种传递依赖性,这意味着它被 CMake 包含,因为它是我项目的直接引用库之一包含的引用(默认 CMake 行为)。我更改了依赖项目的 CMakeLists.txt 文件,通过将 PRIVATE 关键字添加到 target_link_libraries CMake,使其依赖项不包含在 C++/CLI 项目中命令和瞧:
target_link_libraries(DependentTarget PRIVATE ${REQUIRED_LIBS})