.NET从C ++ CLR DLL

时间:2015-10-09 20:57:24

标签: c# .net dll c++-cli clr

我有一个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版本完全相同的设置)。

我真的很想帮助解决这个问题。提前谢谢。

1 个答案:

答案 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})