【问题标题】:Automatically generate C# wrapper class from dll in Visual Studio 2010 Express?在 Visual Studio 2010 Express 中从 dll 自动生成 C# 包装类?
【发布时间】:2012-07-25 00:26:01
【问题描述】:

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

谢谢大家!


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

【问题讨论】:

  • @CodyGray,很棒的链接!谢谢,我去看看!
  • 我怀疑他们在谈论 Hans 在回答中提到的类型库导入器 (tlbimp.exe)。不过我不确定,我假设您正在处理一个 COM DLL,而这并不完全内置于 VS Express...
  • @CodyGray,是的,我想使用已安装驱动程序的 dll 与设备通信。
  • 你说的是什么dll? COM,纯 c 还是什么?

标签: c# dll wrapper visual-studio-express


【解决方案1】:

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

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

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

所以

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

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

【讨论】:

    【解决方案2】:

    这对于任何 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 团队设计,作为 16 位 VB 可扩展模型 VBX 的替代品。它们已经非常成功,几乎所有 Windows 编译器都支持它们。但是它们的表达能力有限,不支持泛型和实现继承之类的东西。值得注意的是,Windows 8 团队已经替换了 WinRT 的类型库。他们选择了 .NET 元数据格式。

    【讨论】:

      【解决方案3】:

      3 例:

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

      【讨论】:

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