【问题标题】:How to access and understand old dll from C#如何从 C# 访问和理解旧的 dll
【发布时间】:2010-10-18 17:07:39
【问题描述】:

我已经获得了一个旧的 dll 以及通过 C# .NET 3.5 访问它的任务。我相信 dll 最初是用 VB6 构建的,但并不积极。除了如何在 VB6 中使用它的示例之外,没有该 dll 的文档或源代码。我已经能够通过 VB.NET 3.5 成功访问它。访问示例代码如下所示:

myLib = CreateObject("MyLib.api")
myConnection = myLib.CreateObject("NameOfConnectionObject")
myConnection.do_something("abc")

从库中创建了几个不同的对象,所有这些对象都有不同的方法。我尝试使用不同的 dll 读取工具,但所有导出方法都显示为垃圾。我也尝试在 Visual Studio 中导入 dll,但我收到一条错误消息,指出 dll 不可访问和/或不是 COM 对象或程序集。所以,我只知道稀疏的旧文档中的方法。

关于如何在 C# 中访问和/或了解更多关于这个神秘 dll 的任何想法?

谢谢!

【问题讨论】:

  • 我还应该补充一点,该库最初是在 2000 年到 2002 年之间的某个时间创建的。不确定这是否重要。

标签: c# .net vb.net dll vb6


【解决方案1】:

代码sn-p是使用后期绑定的,肯定是COM服务器。如果它是用 VB6 编写的,那么它也应该有一个类型库。如果您无法从 Visual Studio 添加对它的引用,则可能性很低,但我见过一些失败的案例,但 Tlbimp.exe 没有问题。从 Visual Studio 命令提示符运行它。您也可以运行 OleView.exe 并使用 File + View Typelib 查看类型库。

如果这些尝试都失败了,那么你就完成了,你不能在没有文档的情况下对这个 COM 组件进行逆向工程。坦率地说,这无论如何都是相当冒险的。如果这个 COM 组件的原始供应商倒闭了,那么至少应该有一个仍然记得在做这个的程序员。他可能正在阅读 SO,但在你放弃一些名字之前他找不到你。

【讨论】:

  • 所有这些都是好主意。您应该能够在 VS 中添加对它的引用,然后使用对象浏览器检查可用的对象和属性/方法。也仅仅因为现有的代码示例显示使用库 LATEBOUND 并不一定意味着您必须这样做。使用 VS 中的对象浏览器应该可以让您实例化对象并从几乎任何 VB6 创作的 COM 库中获得良好的智能感知。
  • +1 首先尝试这些想法。如果他们失败了,我会在进行逆向工程或重写之前再尝试一件事。编写一个新的 VB6 组件作为桥梁,即神秘 dll 周围的薄包装。从 C# 调用新包装器应该没有任何问题。如有必要,您可以更改方法签名等以解决出现的任何问题。
  • 感谢您的建议...没有一个有效。我做了更多的挖掘,发现实例化的对象不是来自我假设的 dll,而是来自旧的 powerbuilder dll。我假设 powerbuilder dll 传递给我最初给定的 dll。
  • 同意,如果这是 Powerbuilder,请放弃所有希望。后期装订是你的命运。在 VB.NET 和 C# 4.0 中使用 dynamic 关键字还可以。
【解决方案2】:

你试过反射器吗? http://www.red-gate.com/products/reflector/ ?

编辑:反射器不适用于非 .net 程序集,这是 VB6,所以这不是一个可行的解决方案

【讨论】:

  • Reflector 反编译 .Net 而不是 VB6。这个神秘的 DLL 似乎不太可能是 .Net DLL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多