【问题标题】:Old C++ DLLs into C#将旧的 C++ DLL 转换为 C#
【发布时间】:2018-04-05 15:25:08
【问题描述】:

我有一个 C# 项目,需要我使用用 C++ 编写的 SDK。我对 C++ 有点陌生,但我设法找到了我需要的所有重要函数和类。

根据我所学到的,我想 C++/CLR 将是我最好的选择。

SDK 本身主要使用一个名为“VssSDK.dll”的 DLL,它带有多个头文件。

现在是 2018 年,所以我希望有某种方法可以将非常大的 DLL 转换为我可以在我的 .NET 应用程序中使用的东西无需花费 10 小时创建标头以及不使用 CLR 的内容(这就是他们创建包装器的意思吗?)。

我希望这个线程对任何需要承担相同任务的人有用:将旧 DLL 导入 C# 项目。

任何指南和信息都会有所帮助。

  • SDK 在 Visual Studio 2010 上编译
  • VssSdk.ddl 是一个共享库
  • 我需要重新使用 VssSdk.dll 中包含的类
  • 需要兼容 .NET 使用 4.6.2 框架
  • VssSdk.dll 需要数百个函数和类
  • 我还没有设法将 SDK 演示迁移到 VS2017 中

【问题讨论】:

标签: c# c++ clr wrapper


【解决方案1】:

要使用本地 dll 中的本地方法,您需要使用 DllImport 属性和 extern 关键字声明它。你可能会看到extern documentation here

要使用类和类方法,您应该首先创建一个包装 dll(将类方法转换为将第一个参数作为指向类对象的指针的函数)。您可以使用Wrappit 工具。

我希望这会有所帮助。

【讨论】:

  • 谢谢,这会奏效。我不会为整个 SDK 创建包装器,而是在 C++ 项目中创建新的函数来生成我需要的东西,并为数量少得多的函数创建包装器。以这种方式使用互操作时,加载的 dll 仍然可以正常工作,对吗? IE。如果我在 C++ 中使用的函数具有静态变量,它们在调用函数时会被保存/修改吗?这意味着如果我导入一个 dll,整个 dll 会正确加载到 RAM 中吗?
  • 我对这个 Dll 导入的东西有很大的问题。我可以轻松地将数据从 C# 传递到 C++,反之亦然,但是一旦我开始调用一些“较重”的函数,我就会得到无法调试的 "System.AccessViolationException",因为 "HResult=0x80004003"和“”。我的 C++ 程序可以自己正常工作,但当我在“extern”C”__declspec(dllexport)”中重复使用相同的函数时就不行了
  • 很抱歉耽搁了,我没有定期检查stackoverflow。我希望问题现在得到解决。如果不是,我认为了解有关编组的更多详细信息会有所帮助:codeproject.com/Articles/66245/…
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多