2009-07-25 33 views
4

最后更新时间:2009-08-11下午2:30 EDT将C#结构,以COM打破了VB6应用

前几天我张贴this question的一些很奇怪的问题。那么,我想出了什么是造成一台机器上的内部版本无法在其他机器上运行的问题,甚至还提出了一个解决方法,但现在它给我留下了一个很好的具体问题:为什么?

要重现该问题,我创建了一个新的InteropUserControl并执行以下操作:

  1. 添加新public struct MyStruct
  2. 给它一个GUID和ComVisible属性
  3. 一个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#版本中明确编码,这就是两者之间的所有不同。

+1

在getMyStruct,什么是毫秒?它应该是数据吗? – SwDevMan81 2009-07-26 15:00:54

+1

你能提供一个简短但完整的复制吗? – AnthonyWJones 2009-07-26 15:03:08

+0

@ SwDevMan81:是的,它应该。在我的部分错别字。它会在一秒钟内修复。 – 2009-07-27 13:30:05

回答

2

我想我找到了解决这个问题。 我有同样的确切问题,当通过传递结构调用互操作库的方法时,vb6会中断。这是我为测试DLL互操作而创建的一个项目,所以我在我的项目中所有的都是一个表单。但我有另一个项目(主要应用程序)具有相同的参考,它工作正常。

阅读乔尔文章后,我想测试他的解决方案,并在事实上ID没有工作(使用类,而不是一个结构)。但是我有其他的使用结构的interop,所以我很担心我的应用程序在任何时候都可能失败。此外,我不想做额外的工作来创建和暴露接口和类来替换结构。

所以,我把代码从我的形式,并将其移动到一个公共子一个模块中。它立即工作。顺便说一下,这就是我在主应用程序中实现了通话的过程,这个应用程序工作正常。

我希望这可以帮助别人。

1

是否有一些魔力揭露一个 结构到COM在VB6中使用?

文章COM Data Types * MSDN上说,结构支持。具体来说,MSDN文章说,作为COM结构的定义:

ByRef VALUETYPE<MyStruct> 

也有一对夫妇在页面底部的[用户COM可调用的包装物品,您不妨审查这些。

  • 编辑(2016):原始链接已损坏,所以我将其修正为.Net Framework 3.5版。