从 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})