1

我刚拿到一个由 C++ dll、lib、exe 和各种 .h 文件组成的 SDK。我认为它适用于 C++ 开发人员。他们随文档提供的示例项目都是用 C++ 编写的。我可以使用 Visual Studio 8 (2005) 启动它们并运行它们。他们确实像宣传的那样控制设备。但是,需要使用的项目在 C# .Net 2.0 中,这是不可更改的。

我的老板是一名 C++ 开发人员,他说我需要做的就是将它编译为 COM 对象,然后将 COM 对象导入到我的 C# 解决方案中。我的老板说,将 SDK 作为 COM 对象“包装”起来应该不到一个小时,即使对我来说,即使对 C++ 编译一无所知。

我以前在 C# 解决方案中使用过 COM 对象,所以一旦完成,我就可以从那里继续,没有问题。

但是,我不知道如何从 2 个 .dll 文件、1 个 .exe、1 个 .lib 文件、1 个 .xml 文件和 12 个 .h 文件中创建 COM 对象。是否有资源可以告诉我如何才能实现这一目标?

4

7 回答 7

3

我的老板是一名 C++ 开发人员,他说我需要做的就是将它编译为 COM 对象,然后将 COM 对象导入到我的 C# 解决方案中。

确实如此,但是将其编译为 COM 对象是“困难的”(我的意思是您不能这样做),除非它已经实现了 COM API(如果没有,那么您需要先实现 COM API您可以将其构建为 COM 对象)。

有一些书籍(例如Essential COM)解释了如何使用 C++ 创建 COM 对象,但这并不重要(对于构建 COM 对象,可能有比Essential COM更好的书籍,以及比 C++ 更好/更简单的工具)。

我认为你和/或你的老板有 3 个选择:

  1. 要求供应商将它们作为 COM 对象提供给您
  2. 设计一个封装 SDK API 的 COM API。创建一个导出此 API 的 COM 项目(使用您选择的语言)。通过调用底层 SDK 方法来实现这些 API。要做到这一点,您可能需要了解 C++ 的人,或者愿意在这个项目上花费比“一个小时”更长的时间。
  3. 忘记使用 COM;相反,将 SDK 构建为 DLL,并使用 PInvoke 从 .NET 代码中调用它。

我的老板说,将 SDK 作为 COM 对象“包装”起来应该不到一个小时,即使对我来说,即使对 C++ 编译一无所知。

根据你所说的,我不知道有什么办法可以做到这一点。

于 2009-01-06T16:44:08.400 回答
1

告诉你的老板,如果他不到一个小时就可以完成,他当然应该这样做:这样可以更有效地利用你的时间。

我还建议使用 ATL(不使用属性),但如果您没有经验,这可能需要一些时间才能完成。

于 2009-01-06T18:43:16.710 回答
0

我的老板说,将 SDK 作为 COM 对象“包装”起来应该不到一个小时,即使对我来说,即使对 C++ 编译一无所知。

这对于经验丰富的 C++/COM 开发人员可能是正确的,但对于初学者则不然。我认为你最好的选择是使用 ATL。看看MSDN 教程

并且不要使用属性。

于 2009-01-06T16:36:48.180 回答
0

这并不能完全回答您的问题,但是...

一种替代尝试创建 COM 对象的选择是使用 P/Invoke 并仅调用 DLL 中的方法。

MSDN 论坛上的这个线程记录了如何使用 P/Invoke 制作 DLL 来调用。

当然,如果您需要访问整个类(并创建所述对象的实例),这将无济于事。

于 2009-01-06T16:41:44.317 回答
0

代码为您编译和运行很好。也就是说,假设您可以在一小时内完成此操作是完全不公平的。

您是否检查过 Visual Studio 实际构建的内容。它可能已经在构建 COM 对象。

调查代码是如何被调用的。我假设您有一个可以运行以测试代码的 .exe。在 VC++ 调试器中逐步执行此操作(它与调试 C# 代码非常相似)并尝试识别与您的文档/期望匹配的任何 API 调用。如果您尝试走 P/Invoke 路线,这些知识将很有帮助。

其他需要考虑的是SWIG。这通常由 Python 开发人员用来包装 C/C++ 代码并为 C# 提供一些支持。

对于有经验的 C++ 开发人员来说,托管 C++ 路线可能更可取,因为除了最简单的代码之外,您需要了解很多关于内存分配的知识。

于 2009-01-06T16:57:12.087 回答
0

我(嗯,真的是我的领导和我)将首先尝试对公司提供的 SDK dll 使用 p/Invoke(通过 System.Runtime.InteropServices 的 DllImport 功能)。我会让你知道情况如何。

于 2009-01-06T20:33:51.870 回答
-1

我认为您真正想要/需要的是 C++/CLI,这样您就可以直接将它们构建到托管程序集中。这个想法是你编写一个非常简单的包装器,看起来像是 C# 和 C++ 之间的一种交叉,然后它会完成其余的工作。

于 2009-01-06T16:29:13.983 回答