【问题标题】:Calling a function using C# Interop library without class defined使用未定义类的 C# 互操作库调用函数
【发布时间】:2020-08-14 00:04:54
【问题描述】:

我有一个 VB6 应用程序,我需要能够将引用从一个 dll 切换到另一个(我正在编写)

它需要能够在不添加类的情况下调用 someFunction()

在 vb6 中:

Dim test As SomeObject
Set SomeObject = someFunction("test")

这两个 dll 需要在代码方面是可互换的。我们只希望在生成的程序中引用一个更改来做两件不同的事情

似乎 C# 不允许静态函数的互操作(由于 COM 限制);虽然我仍然需要一个暴露给 vb6 的函数来满足这个要求

【问题讨论】:

  • 所以,你是说 C# 不允许你需要的东西..?
  • 更具体地说,COM 标准不允许我做我需要的事情。而且我想知道是否有人知道一个很好的解决方案,因为标准库多年来一直在做这种事情
  • “标准库”是否在 VB6 中实现? AFAICR 有一个特殊功能,允许您在 VB6 COM DLL 中创建特殊类,并且该类的方法对于 VB6 客户端来说似乎是静态函数。在幕后,我认为运行时创建了一个类的实例来实现这一点。我现在不记得该功能的名称了。 “全球单一用途”或“全球多用途”还是什么?我不记得你是否可以在 C# 互操作库中模拟它。如果以后有时间,我会尝试从我的书中挖掘出答案...
  • @MarkJ 如果你能找到任何关于它的信息,我很想听听。我已经把头撞在这堵墙上一天左右了,我尝试了很多不同的东西。我知道 COM 对象需要实例化,但我希望它可以在 DLL 端加载它或类似的东西(如 Init 函数)但调用它仍然会遇到添加实例化对象的相同问题
  • 我不明白为什么你的 2 个 DLL 不能只拥有同名的类和同名的函数,它们的操作方式不同。为什么需要避免类引用?

标签: c# vb6


【解决方案1】:

如果您可以访问代码,为什么不添加新模块并添加该功能。在函数体中像往常一样调用 COM 对象。通过这种方式,您不必更改代码中对函数调用的所有引用,我认为这是您想要避免的。

【讨论】:

  • 如果可以的话,我想避免它,但这不是一个糟糕的解决方案,因为我希望能够(在某些特定情况下)替换 dll 而无需像我们的一些用户那样重新编译。 ...奇怪的(大部分是非常旧的)安装有很多过时的参考,我不想在安装时与之抗争。在那些情况下,如果我可以复制和替换 dll,我会很高兴
  • @SLWW 也许this question 会有用?似乎是您想要实施的想法。
  • 感谢@BrianMStafford,一旦我克服了 COM 标准对我施加的这种烦人(且不必要)的限制,这应该会帮助我:/
【解决方案2】:

我找到了答案;我只是有一段时间没找对地方。

UnmanagedExports (Repacked)

一个非常有用的 nuget 包,可以导出具有“DllExport”属性的函数

例如:

在 C# 中

[DllExport]
public static void HelloWorld() { return "Hi!" }

可以像这样从 VB6 应用程序调用

Private Declare Function HelloWorld Lib "MyCSharpDll.dll" () As String

稍后在代码中简单地调用它(如果你想输出像 MsgBox 一样)

MsgBox HelloWorld() 

这将简单地返回“嗨!”在消息框中

这样是不是很酷?

您可以使用开发者控制台中的此命令查看 .dll 中的导出

dumpbin /EXPORTS MyCSharpDll.dll

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多