我试图通过使用类似obj.Do("text")
的代码来访问COM方法,而Do
是obj中的方法,它以ref string
作为其输入(obj是.COM对象,用VB6编写)。但是,它总是抛出COMException类型不匹配。我尝试传递obj.Do(ref a)
,而a是一个字符串变量,但它也不起作用。
VB代码看起来像这样
Function Generate(sDestinationFile As String)
....
Exit Function
您知道是什么原因造成的,我应该如何解决?
VB6 cls是什么样的?
例如,类似的事情似乎可以作为一种快速测试。
VB6 cls命名为stringMe.cls:
Dim someString As String
Function AddString(ByRef someString)
AddString = "Hello " & someString
End Function
我将其编译为ActiveX DLL。
在C#中,我添加了对DLL的引用并进行了编码:
static void Main(string[] args)
{
StringMe sm = new StringMe();
object inVar = "world!";
string returnVar = sm.AddString(ref inVar).ToString();
System.Console.WriteLine(returnVar);
}
使用VB6组件,请确保您拥有一个二进制兼容性参考DLL,并将其放在一边,以便在每次编译时都为dll生成相同的DispID,否则.Net项目的Interop将不会引用正确的方法。
只需记住,在添加方法等之后重新编译VB6组件时,您将需要为.Net项目生成一个新的Interop。
使用命令行参数进入tlbimp以确保您具有一致的Interop,而不是在您选择向Com Component添加引用时生成的默认Interop。
要从.net调用vb6组件,您必须这样做
var array = new string[20];
var x = new System.Runtime.InteropServices.VariantWrapper(array as object);
var x2 = x as object;
comComponent.callFunction(ref x2);
对我来说这是其他解决方案的重新运行类型不匹配错误。