我的一位同事告诉我,Visual Studio 允许指向 a.dll
并自动生成一个 C# 包装类。这真的可能吗?如果是这样,如何实现这一目标?我浏览了网页,但没有提出任何建议!
谢谢大家!
我想我也会分享这些资源,
我的一位同事告诉我,Visual Studio 允许指向 a.dll
并自动生成一个 C# 包装类。这真的可能吗?如果是这样,如何实现这一目标?我浏览了网页,但没有提出任何建议!
谢谢大家!
我想我也会分享这些资源,
3个案例:
这对于任何 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 元数据格式。
我知道这个问题已经相当老了,而且似乎已经得到了充分的回答,但我只想添加一个我认为可能很重要的想法。我可能完全错了,所以请对我的回答持保留态度,如果我错了,请纠正我。
为了能够调用 DLL 中的成员/字段,调用它们所需的信息必须能够以某种形式访问。这些信息应该是编写包装器所需的全部信息。有了它,您可以确定所有成员/字段“表单”,也就是方法头等等。
在 C# 中,可以通过反射加载 DLL 并获取该信息。我不知道上述不同的 DLL 类型,但正如我所说,要调用成员/字段,这些信息必须以某种形式存在。因此,使用反射来获取该信息,您可以生成一个新类,例如“prefixOriginalname”,并使其具有与原始类相同的成员/字段,调用原始类的成员/字段并添加您想要的额外功能。
所以
正如我所说,我对这个不是 100% 确定的,因为其他答案让我觉得这可能因为某种原因太难甚至是不可能的。