希望问题很清楚,但为了清楚起见,请补充一下:
我有一个 VB6 dll,它定义了我在 C# dll 中引用的枚举。C# dll 使用 idispatch 接口以正确的方式定义了 CCW,该接口声明了一个返回类型为枚举的函数。
运行 regasm 时,我收到一个警告,指出枚举不是 COM 可见的,因此不会导出该函数。由于它是在我的 VB6 库中定义的,我会认为它已经是 COM 可见的,因为它是在 COM dll 中定义的。
我意识到我可以停止搞砸并使用 int 来传递枚举并只进行任何一端的转换,但这很令人沮丧,我想知道是否存在一种方法。
根据要求,这里是一些示例代码:
VB6 dll 定义了一个枚举
Public Enum myEnum
first = 0
second = 1
End Enum
这通过互操作导入到 C# 中,如果您查看元数据,它看起来像这样
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
然后定义CCW接口
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasm 抱怨 myEnum 不可见。我必须同意它,因为元数据视图没有 com visible 属性。奇怪的是,如果我使用 VB dll 中定义的其他类型作为函数的参数,我没有得到任何抱怨,它似乎是枚举,我猜这是因为我实际上暴露了 VB6 枚举的互操作实现而不是实际枚举。
所以我想我理解这个问题,我想知道的是,是否有一种方法可以使用不涉及破解任何中间或自动生成的代码的枚举来使其工作。