【问题标题】:Calling vb6 dlls from c#从 c# 调用 vb6 dll
【发布时间】:2012-03-04 14:08:09
【问题描述】:

我一直在尝试从 C sharp 应用程序调用 vb6 dll,而不使用注册表。我想在使用时使用 dll 的路径。我无法创建 vb dll 类的对象。请帮忙!目前我写的代码如下:

Assembly assem = Assembly.LoadFile("dll path");
Type classType = assem.GetType("classname");
MethodInfo method = classType.GetMethod("show"); //My methos is called show
method.Invoke(null,null); // I have to invoke the method using class object, which I am unable to create

【问题讨论】:

  • VB6 DLL 应该是 PInvoked,您当前加载它们的方式是 .NET DLL
  • @bhavna 我不确定您是否可以使用Assembly.LoadFile 来使用VB6 DLL。您是否尝试过使用PInvoke 调用该函数?
  • 好的。非常感谢您的提示。但我对 c sharp .net 框架很陌生。您能否指导我如何用 c 语言编写从 vb6 dll 调用方法的代码?任何形式的帮助将不胜感激。
  • 仅供参考,语言名称是“C#”
  • @Marco & other close voters 我们不应该关闭这个问题。这不是重复的,因为 bhavna 不想使用注册表。我承认在不知道为什么 bhavna 不想使用注册表的情况下很难回答,但在我们投票结束这个问题之前,让我们给 bhavna 一个扩展的机会“不是一个真正的问题”

标签: c# vb6 interop


【解决方案1】:

假设方法show在dll的导出表中,尝试使用DllImportAttribute调用show方法。

【讨论】:

  • 100 次中有 99 次 VB6 DLL 不会通过导出表公开任何有用的信息。它们是 COM DLL。 (很少 DLL 作者会使用黑带技术来导出函数,就好像 DLL 是旧式 DLL。)
  • 你能给我一个执行相同操作所需的代码示例吗?
  • 我应该如何将方法放在导出表中?
  • 例如。您可以从托管代码 [DllImportAttribute("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam) 调用 user32.dll 中的 windows sendmessage; public void yourMethod() { SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);只有当 dll 有导出表中的方法时,才能做到这一点。
  • 无注册 COM 将比通过 VB6 中的导出表导出方法,然后尝试从 .Net 中 P/Invoke 它们简单得多。这是非常先进的东西。
【解决方案2】:

MarkJ 提到的您的 VB6 dll 是一个 COM Dll,通常需要使用 regsvr32 注册才能使用它们。

注册后,您可以像使用 .NET dll 一样添加对它的引用,即右键单击项目中的引用,单击添加引用,然后选择窗口上的 COM 选项卡并查找您的 COM DLL 名称。

那么您应该能够像使用 .NET 参考一样使用它。
下面是一个示例,说明如何使用对 Microsoft Excel 的 COM 引用。
How to: Use COM Interop to Create an Excel Spreadsheet

如果您特别想要后期绑定,那么您的 dll 仍然需要注册,但您不需要手动添加引用,您可以使用 Activator.CreateInstance() 来获取您的 COM 对象的实例。
Calling COM component from C# using late binding

【讨论】:

  • 您好,我需要后期绑定使用,不使用注册表信息。这就是问题所在!
  • 你能告诉我更多关于你的场景的细节吗? dll 会在目标系统上注册,而不是在您的系统上吗?因为我认为在没有注册的情况下实际上不可能使用 COM dll。
  • 这篇文章可能是相关的Registration free activation of COM components
  • 这与我在答案中发布的链接相同。 @bhavna,我认为您需要确切地解释您需要做什么以及为什么。你想解决什么问题? 为什么你不能使用注册表?
  • @bhavna 那么你需要免注册的 COM。请参阅link in my answer。或者,它可能更简单,只要确保您只注册了一个 DLL。当您创建 DLL 的新版本时,请确保它们与旧版本向后兼容。在 VB6 项目设置中使用“二进制兼容性”以保持语法和 COM 接口不变,并确保不要更改 DLL 的协定/语义。
【解决方案3】:

VB6 DLL 是 COM DLL。通常您会注册 DLL(在注册表中),然后从您的 .NET 项目中添加对 VB6 DLL 的引用。

MSDN article 提供了从 .Net 应用程序使用无注册表 COM 的演练。

【讨论】:

  • 感谢大家的帮助,但这些文章仅提供有关 win32 dll 使用的信息 :'( 我有一个要在 C# 中使用的 vb6 dll。
  • 该链接包含有关 .Net 客户端和 VB6 服务器的信息。查看本节,第 2 步 B 部分 msdn.microsoft.com/en-us/library/… 和本节 msdn.microsoft.com/en-us/library/…。我同意这篇文章最好不要在一篇文章中涵盖 C++、C#、VB.Net 和 VB6!
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
相关资源
最近更新 更多