【发布时间】:2009-07-25 21:55:13
【问题描述】:
最后更新时间: 2009-08-11 美国东部时间下午 2:30
几天前,我在this question 上发布了一些非常奇怪的问题。好吧,我弄清楚了具体是什么导致一台机器上的构建无法在其他机器上运行,甚至想出了一个解决方法,但现在它给我留下了一个很好的具体问题:为什么?
为了重现该问题,我创建了一个新的 InteropUserControl 并执行以下操作:
- 添加一个新的
public struct MyStruct: - 给它一个 GUID 和
ComVisible属性 - 在
_InteropUserControl接口中添加GetMyStruct成员,并在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中,什么是ms?应该是数据吗?
-
你能提供一个简短但完整的复制吗?
-
@SwDevMan81:是的,应该。错字就我而言。它会在一秒钟内修复。
-
@AnthonyWJones:它太大了。 InteropUserControl 项目模板从 396 行
ActiveXControlHelpers.cs开始,它具有注册/取消注册功能,InteropUserControl.cs超过 280 行。但是,我已经提供了我添加到此起始模板的所有内容,并且我将在我的问题中添加指向项目模板的链接。您将能够获得相同的代码,但重现性也与编译机的配置有关。 -
在顶部,public class MyStruct 应该是代码中的 public struct MyStruct 吧?我不是想成为一个混蛋,只是想确保我拥有正确的东西。