【问题标题】:System.AccessViolationException when calling C++ from C#从 C# 调用 C++ 时出现 System.AccessViolationException
【发布时间】:2011-01-22 15:33:49
【问题描述】:

我不知道为什么,但今天 myOpenID 似乎不起作用。无论如何......我有这个问题:我有一个非托管 C++ 库 (DLL),我必须将其嵌入到现有的 C# 项目中。现在......我在托管 C++ 中创建了一个迷你包装器(DLL),它调用库,以便我可以从 C# 代码加载它,当我从命令行 C# 项目尝试它时,它完美地工作,对吧结果,正确的行为 ecc。

现在,当我在实际项目中加载它时,它开始给我来自 mini-wrapper DLL 的奇怪 System.AccessViolationException。我在 C# 方面没有经验,也没有在 Windows 下进行一般托管/非托管 C++ 开发,我只是不明白为什么这应该在 C# 项目中工作,而不是在另一个项目中工作。

更多信息:原始库使用 OGRE3D 渲染引擎进行计算,而我必须使用该库的项目在后台使用 OGRE,这会导致问题吗?

有什么建议吗?

【问题讨论】:

  • 真实项目是否意味着另一台机器?我的意思是,你尝试在不同的环境中使用你的 dll 吗?
  • 不同的 C# 项目但同一台机器。

标签: c# c++ exception dll managed


【解决方案1】:

这里有一些想法供您尝试,先生......

  1. 很难确切地知道发生了什么,但我会尝试做的第一件事是从混合中删除这个托管的 c++ dll。这可能会使事情变得混乱。在这里的某个地方,感觉就像在托管和非托管世界之间没有正确编组数据。此外,仅仅因为它没有从控制台崩溃,并不一定意味着代码可以正常工作,它仍然可能会中断,只是不会以触发访问冲突的方式。我首先要看的是使用 p/invoke 直接调用你的非托管 dll,如果它坏了,你应该很快就会知道:

    Calling Win32 DLLs in C# with P/Invoke

  2. 这可能是在混合的某个地方,这个指针被移动到一个不同的地址空间,那个指针没有意义。这里有任何流程边界吗?

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多