gpt4 book ai didi

c# - 将 C# 结构暴露给 VB6 应用程序的 COM 中断

转载 作者:行者123 更新时间:2023-11-30 12:18:53 25 4
gpt4 key购买 nike

最后更新时间: 2009-08-11 2:30pm EDT

几天前我发布了this question关于一些很奇怪的问题。好吧,我弄清楚是什么导致在一台机器上的构建无法在其他机器上运行,甚至想出了一个解决方法,但现在它留给我一个很好的、具体的问题:为什么?

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

  1. 添加一个新的public struct MyStruct:
  2. 给它一个 GUID 和 ComVisible 属性
  3. _InteropUserControl接口(interface)中添加一个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 事件接口(interface)、_InteropUserControl 接口(interface)和一些相关属性。这些在 C# 版本中明确编码,这就是两者之间的所有区别。

最佳答案

我想我找到了解决这个问题的方法。我有同样的问题,vb6 在通过传递结构调用互操作库的方法时中断。这是我为测试 DLL 互操作而创建的项目,因此我的项目中只有一个表单。但是我有另一个项目(主应用程序)具有相同的引用并且它工作正常。

阅读 Joel 的帖子后,我想测试他的解决方案,事实上 id 确实有效(使用类而不是结构)。但是我还有其他使用结构的互操作,所以我很担心我的应用程序在任何时候都可能失败。此外,我不想做额外的工作来创建和公开接口(interface)和类来替换结构。

因此,我从我的表单中取出代码并将其移动到模块中的公共(public)子项中。它立即起作用。顺便说一下,这就是我在运行正常的主应用程序中实现调用的方式。

希望对其他人有帮助。

关于c# - 将 C# 结构暴露给 VB6 应用程序的 COM 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1183167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com