在未定义类的情况下使用C#互操作库调用函数

在未定义类的情况下使用C#互操作库调用函数,c#,vb6,C#,Vb6,我有一个VB6应用程序,我需要能够将引用从一个dll切换到另一个dll(我正在编写) 它需要能够在不添加类的情况下调用someFunction() 比如 在vb6中: Dim测试为SomeObject 设置SomeObject=someFunction(“测试”) 这两个DLL需要可交换的代码。我们只希望在结果程序中更改一个引用,以执行两个不同的操作 似乎C#不允许静态函数的互操作(因为COM限制);尽管我仍然需要一个在vb6中公开的函数来满足这一要求如果您可以访问代码,为什么不添加一个新模块

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

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

比如

在vb6中:

Dim测试为SomeObject
设置SomeObject=someFunction(“测试”)
这两个DLL需要可交换的代码。我们只希望在结果程序中更改一个引用,以执行两个不同的操作


似乎C#不允许静态函数的互操作(因为COM限制);尽管我仍然需要一个在vb6中公开的函数来满足这一要求

如果您可以访问代码,为什么不添加一个新模块并添加该函数呢。在函数体中,像往常一样调用COM对象。这样,您就不必在代码中更改对函数调用的所有引用,我认为您应该避免这样做。

我找到了答案;我只是一时找不到合适的地方

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

例如:

在C中#

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

Private Declare Function HelloWorld Lib "MyCSharpDll.dll" () As String
稍后在代码中只需调用它(如果您想像MsgBox persay那样输出)

只需在消息框中返回“嗨!”

那不是很酷吗

您可以从开发人员控制台使用此命令从.dll查看导出

dumpbin /EXPORTS MyCSharpDll.dll

那么,你是说C#不允许你需要什么?更具体地说,COM标准不允许我做我需要的事情。我想知道是否有人知道一个很好的解决方案,因为标准库在VB6中实现的“标准库”已经为很多年做过这种事情了?AFAICR有一个特殊功能,允许您在VB6 COM DLL中创建特殊类,该类的方法对于VB6客户端来说似乎是静态函数。在幕后,我认为运行时创建了一个类的实例来实现这一点。我现在记不起该功能的名称了。“全局单用途”或“全局多用途”还是什么?我不记得你是否可以在C#interop库中模拟这一点。如果我以后有时间,我会努力从我的书中找出答案…@MarkJ如果你能找到关于它的任何信息,我很乐意听到。我已经用头撞这堵墙一天左右了,我尝试了很多不同的东西。我知道COM对象需要实例化,但我希望在加载它或类似的东西(比如Init函数)时可以在DLL端完成,但调用它仍然会遇到添加实例化对象的相同问题。我不明白为什么您的2个DLL不能只具有相同名称的类和相同名称的函数,它们的运作方式不同。为什么您需要避免类引用?如果可以的话,我想避免类引用,但这不是一个坏的解决方案,原因是我希望能够(在某些特定情况下)在不重新编译的情况下替换dll,因为我们的一些用户确实。。。。奇怪的(大多是非常旧的)安装,有很多过时的引用,我不想在安装时与之抗争。在这种情况下,如果我可以复制并替换dll,我会happy@SLWW也许会有用?这似乎是您希望实现的想法。谢谢@BrianMStafford,一旦我克服了COM标准对我施加的这种恼人(和不必要的)约束的大部分冲击,这应该会对我有所帮助:/
MsgBox HelloWorld() 
dumpbin /EXPORTS MyCSharpDll.dll