最近更新:2009年8月11日下午2:30
几天前,我发布了一个关于一些非常奇怪问题的问题。好吧,我找出了具体导致在某些机器上无法运行构建甚至想出了解决方法,但现在留下了一个很好的、具体的问题:为什么?
为了重现这个问题,我创建了一个新的InteropUserControl并执行以下操作:
- 添加一个新的
public struct MyStruct
: - 给它一个GUID和
ComVisible
属性 - 在
InteropUserControl
中添加一个GetMyStruct
成员并实现它。
MyStruct
:
[Guid("49E803EC-BED9-4a08-B42B-E0499864A169")]
[ComVisible(true)]
public struct MyStruct {
public int mynumber;
}
_InteropUserControl.GetMyStruct()
:
[DispId(7)]
void getMyStruct( int num, ref MyStruct data );
我已经尝试过返回
MyStruct
而不是通过引用传递,也实现了 InteropUserControl.GetMyStruct()
方法:public void getMyStruct( int num, ref MyStruct data ) {
data = new MyStruct();
data.mynumber = num * 2;
}
我还将程序集签名并安装到GAC,并使用Regasm进行注册。将其添加到新的VB6项目并调用
GetMyStruct()
,然后在我们的构建机上编译后,它拒绝在其他机器上运行。为了解决这个问题,我不得不将结构体暴露给COM而不是类,并且基本上将
GetMyStruct
更改为以下内容:public void GetMyData( int num, MyClass data ) {
data.mynumber = num * 2;
}
在我的实际项目中,我从内部检索结构体,然后将所有字段值从结构体复制到由客户端传递给方法的类实例的匹配成员上。
那么为什么结构体会导致这种行为,而类却可以正常工作?暴露结构体供VB6使用有什么神奇的地方吗?
我认为这可能与OLE自动化有关。
注意:我还尝试返回结构体而不是使用
ref
参数,但这并没有改变行为。编辑以添加项目模板链接: Interop Forms Toolkit 2.0是原始的VB.NET项目模板和dll。我没有引用该dll,因此您可能不需要安装它。
CodeProject上的C#模板翻译是我用来创建我的项目模板(而不是项模板)的。VB.NET版本会自动生成__InteropUserControl
事件接口、_InteropUserControl
接口和一些相关属性,而这些在C#版本中需要显式编码,这就是两者之间唯一的区别。