最后更新时间:2009-08-11下午2:30 EDT将C#结构,以COM打破了VB6应用
前几天我张贴this question的一些很奇怪的问题。那么,我想出了什么是造成一台机器上的内部版本无法在其他机器上运行的问题,甚至还提出了一个解决方法,但现在它给我留下了一个很好的具体问题:为什么?
要重现该问题,我创建了一个新的InteropUserControl并执行以下操作:
- 添加新
public struct MyStruct
: - 给它一个GUID和
ComVisible
属性 - 一个
GetMyStruct
成员添加到_InteropUserControl
界面并在InteropUserControl
中实施。
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;
}
在我的实际项目中,我检索结构内部,然后复制从结构到客户端传递给方法的类的实例上的匹配成员的所有字段值。
那么,为什么一个结构导致这种行为,一个类工作正常?将结构暴露给COM以便在VB6中使用有什么魔力?
我认为这可能与OLE自动化有关。
注:我也尝试返回结构,而不是使用ref
参数,但这并没有改变行为。
编辑添加链接项目模板:
Interop Forms Toolkit 2.0是原来的VB.NET项目模板和dll。我没有引用dll,所以你可能不需要安装这个。
C# Translations of templates on CodeProject是我用来创建我的项目模板,而不是项目模板。 VB。NET版本会自动生成事件接口__InteropUserControl
,接口_InteropUserControl
以及一些相关属性。这些都在C#版本中明确编码,这就是两者之间的所有不同。
在getMyStruct,什么是毫秒?它应该是数据吗? – SwDevMan81 2009-07-26 15:00:54
你能提供一个简短但完整的复制吗? – AnthonyWJones 2009-07-26 15:03:08
@ SwDevMan81:是的,它应该。在我的部分错别字。它会在一秒钟内修复。 – 2009-07-27 13:30:05