在Visual Studio 2010 Express中自动从dll生成C#包装类?

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

谢谢大家!


想我也会分享这些资源,

  • 如何:创建COM Wrappers
  • 并且由@Darin提供 ,使用非托管DLL函数

3例:

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

任何DLL都无法做到这一点。 只是一种非常特殊的类型,它实现了一个COM服务器。 转换器需要对导出类型的良好描述,这是由类型库为此类服务器提供的。

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

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

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

我知道这个问题相当陈旧,似乎已经得到了足够的回答,但我只是想补充一点我认为可能很重要的想法。 我可能完全错了,所以如果我是的话,请带着我的答案和我纠正。

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

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

所以

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

正如我所说,我对这一点并不是100%肯定,因为其他答案让我听起来像是因为某些原因可能太难甚至不可能。