26

我的一位同事告诉我,Visual Studio 允许指向 a.dll并自动生成一个 C# 包装类。这真的可能吗?如果是这样,如何实现这一目标?我浏览了网页,但没有提出任何建议!

谢谢大家!


我想我也会分享这些资源,

4

3 回答 3

37

3个案例:

  1. DLL 代表一个托管程序集 => 您在项目中直接引用它并使用它
  2. DLL 代表一个 COM 对象 => 您可以使用tlbimp.exe实用程序来生成托管包装器
  3. DLL 表示具有一些导出函数的非托管库。那是最艰难的一个。没有工具。您必须查阅库的文档以了解导出的函数名称和参数并构建托管 P/Invoke 包装器。您可以使用dumpbin.exe实用程序查看导出函数的列表。这是MSDN 上有关不同步骤的文章。
于 2012-07-30T12:19:52.533 回答
8

这对于任何 DLL 来说肯定是不可能的。只是一种非常特殊的类型,它实现了 COM 服务器。转换器需要对导出的类型进行良好的描述,这是由类型库为此类服务器提供的。

类型库完全等同于托管程序集中的元数据。虽然它以独立文件(.tlb 文件)的形式开始使用,但它通常作为资源嵌入到 DLL 中。它的好地方,保持类型描述接近实现它的代码。就像 .NET 程序集中的元数据一样。

一些用于查看类型库的工具(不确定它是否适用于 Express):在 Visual Studio 中使用 File + Open + File 并选择 c:\windows\system32\shell32.dll。您将看到该 DLL 中的资源,请注意 TYPELIB 节点。这就是类型库。它是二进制的,因此实际上阅读它是不切实际的。为此,请从 Visual Studio 命令提示符运行 OleView.exe。File + View Typelib 并选择相同的 DLL。这会将类型库反编译回 IDL,即最初用于创建类型库的接口描述语言。高度可读性,您在理解该语言时将毫不费力。并且可以很容易地看到 .NET Tlbimp.exe 如何将该类型库转换为等效的 C# 声明。

类型库是旧的,它们从 1996 年就已经存在。最初由 Microsoft 的 Visual Basic 团队设计,作为 VBX 的替代品,16 位 VB 可扩展性模型。它们非常成功,几乎所有 Windows 编译器都支持它们。但是它们的表达能力有限,不支持泛型和实现继承之类的东西。值得注意的是,Windows 8 团队已经替换了 WinRT 的类型库。他们选择了 .NET 元数据格式。

于 2012-07-30T14:04:29.763 回答
0

我知道这个问题已经相当老了,而且似乎已经得到了充分的回答,但我只想添加一个我认为可能很重要的想法。我可能完全错了,所以请对我的回答持保留态度,如果我错了,请纠正我。

为了能够调用 DLL 中的成员/字段,调用它们所需的信息必须能够以某种形式访问。这些信息应该是编写包装器所需的全部信息。有了它,您可以确定所有成员/字段“表单”,也就是方法头等等。

在 C# 中,可以通过反射加载 DLL 并获取该信息。我不知道上述不同的 DLL 类型,但正如我所说,要调用成员/字段,这些信息必须以某种形式存在。因此,使用反射来获取该信息,您可以生成一个新类,例如“prefixOriginalname”,并使其具有与原始类相同的成员/字段,调用原始类的成员/字段并添加您想要的额外功能。

所以

  1. 每个 DLL(或外围文档)都为您提供了使用其类型所需的信息。即所有被实现为“公共”的东西
  2. 您可以通过反射访问所需的信息
  3. 给定 1. 和 2.,您可以创建一个程序来从 DLL 中提取所需的信息并相应地生成包装器。

正如我所说,我对这个不是 100% 确定的,因为其他答案让我觉得这可能因为某种原因太难甚至是不可能的。

于 2018-07-18T08:13:14.310 回答