繁体   English   中英

从C ++ CLR DLL调用函数时,发生类型'System.AccessViolationException'的.NET未处理异常

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM