我尝试使用像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
你知道是什么原因引起的吗?我应该怎样解决这个问题?
答案 0 :(得分:1)
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);
}
答案 1 :(得分:0)
使用VB6组件,请确保您有一个二进制兼容性引用DLL,以便在每次编译时它为dll生成相同的DispID,否则.Net项目的Interop将不会引用正确的方法
请记住,在添加方法等后重新编译VB6组件时,需要为.Net项目生成一个新的Interop。
将命令行参数用于tlbimp以确保您具有一致的Interop,而不是在选择Add Com to Com Component时生成的默认Interop。
答案 2 :(得分:0)
要从.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);
这对我有用,其他解决方案是重新运行类型不匹配错误。