在 Visual Studio 2010 Express 中从 dll 自动生成 C# 包装类?
Posted
技术标签:
【中文标题】在 Visual Studio 2010 Express 中从 dll 自动生成 C# 包装类?【英文标题】:Automatically generate C# wrapper class from dll in Visual Studio 2010 Express? 【发布时间】:2012-07-25 00:26:01 【问题描述】:我的一位同事告诉我,Visual Studio 允许指向 .dll
并自动生成一个 C# 包装类。这真的可能吗?如果是这样,如何实现这一目标?我浏览了网络,但没有提出任何建议!
谢谢大家!
我想我也会分享这些资源,
How to: Create COM Wrappers 感谢@Darin、Consuming Unmanaged DLL Functions【问题讨论】:
Tool for creating .NET wrappers for a COM DLL? 的可能重复项;另见Auto wrap c++ dll into c# @CodyGray,很棒的链接!谢谢,我去看看! 我怀疑他们在谈论 Hans 在回答中提到的类型库导入器 (tlbimp.exe)。不过我不确定,我假设您正在处理一个 COM DLL,而这并不完全内置于 VS Express... @CodyGray,是的,我想使用已安装驱动程序的 dll 与设备通信。 你说的是什么dll? COM,纯 c 还是什么? 【参考方案1】:我知道这个问题已经相当老了,而且似乎已经得到了充分的回答,但我只想添加一个我认为可能很重要的想法。 我可能完全错了,所以请对我的回答持保留态度,如果我错了,请纠正我。
为了能够调用 DLL 中的成员/字段,调用它们所需的信息必须能够以某种形式访问。这些信息应该是编写包装器所需的全部信息。有了它,您可以确定所有成员/字段“表单”,也就是方法头等等。
在 C# 中,可以通过反射加载 DLL 并获取该信息。我不知道上述不同的 DLL 类型,但正如我所说,要调用成员/字段,这些信息必须以某种形式存在。因此,使用反射来获取该信息,您可以生成一个新类,例如"prefixOriginalname" 并使其具有与原始类相同的成员/字段,调用原始类的成员/字段并添加所需的额外功能。
所以
-
每个 DLL(或外围文档)都为您提供使用其类型所需的信息。即所有被实现为“公共”的东西
您可以通过反射访问这些所需信息
给定 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 例:
-
DLL 代表一个托管程序集 => 您可以在项目中直接引用它并使用它
DLL 代表一个 COM 对象 => 您可以使用 tlbimp.exe 实用程序来生成托管包装器
DLL 表示具有一些导出函数的非托管库。那是最艰难的一个。没有工具。您必须查阅库的文档以了解导出的函数名称和参数并构建托管 P/Invoke 包装器。您可以使用dumpbin.exe 实用程序查看导出函数的列表。这是 MSDN 上的an article,关于不同的步骤。
【讨论】:
以上是关于在 Visual Studio 2010 Express 中从 dll 自动生成 C# 包装类?的主要内容,如果未能解决你的问题,请参考以下文章
visual studio 2010的应用程序在哪,那个文件里的哪个?
如何在 Visual Studio 2008 或 Visual Studio 2010 中设置 JavaScript 断点
如何在 Visual Studio 2010 中使用 Visual Studio 2008 创建的 DLL?