微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

COM服务器如何使用不同的ComInterfaceType枚举封送C#类库中的可空?

我听说Nullable< T>是一个C#泛型类,它不能与COM一起使用 – 就像任何其他泛型类一样.

好吧,在我的C#类库中,我有

[InterfaceType(ComInterfaceType.InterfaceIsDual),Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
public interface ICOMClass
{
    int? GetNullable();
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class COMClass : ICOMClass
{
    public int? GetNullable()
    {
        int? hello = null;
        return hello;
    }
}

令人惊讶的是,编译并且我能够在VBE中附加对我的COMClass库的引用.

我知道:

> VBA不在对象浏览器的成员列表中列出.GetNullable()(即使显示隐藏的成员已勾选)
> VBA未在智能下拉列表中列出.GetNullable()

但为什么:

Dim c as new COMClass
c.GetNullable

不抛出相当期望的Object不支持这个属性方法

而不是:

c.NonExistingMethod

有人可以解释为什么吗

我怀疑它与ComInterfaceType Enumeration有关,因为

> both:InterfaceIsDual& InterfaceIsIdispatch就像我上面描述的那样

但:

> InterfaceIsIUnkNown实际上似乎没有编组/触摸GetNullable()并且抛出了预期的错误

谁能解释这种行为?

解决方法

好吧,它编译.但是,当您尝试为DLL创建类型库时,您知道自己遇到了麻烦:
C:\projects2\ClassLibrary38\bin\Debug>tlbexp ClassLibrary38.dll
Microsoft (R) .NET Framework Assembly to Type Library Converter 4.0.30319.33440
copyright (C) Microsoft Corporation.  All rights reserved.

TlbExp : warning TX8013117D : Type library exporter warning processing 'ICOMClas
s.GetNullable(#0),ClassLibrary38'. Warning: Type library exporter encountered a
 generic type instance in a signature. Generic code may not be exported to COM.
Assembly exported to 'C:\projects2\ClassLibrary38\bin\Debug\ClassLibrary38.tlb'

您可以通过在类型库上运行OleView.exe来查看它.这就是你的界面:

[
  odl,uuid(2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E),version(1.0),dual,oleautomation,custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9,"ICOMClass")

]
interface ICOMClass : Idispatch {
};

没什么,nada,zippo. Microsoft编程人员在编写诊断消息时有时过于友好.它不仅仅是“可能不是”,而是“不会”.

这不会起作用.可以通过后期绑定找到方法无济于事,返回值无法正确解释,Nullable< T>不是[ComVisible].作为替代方案,考虑到COM总是必须具有“可空性”的概念,在VBA中得到强烈支持,这在很大程度上取决于它.变体可以存储vtNull或vtEmpty以指示未设置值.它是C#代码中的对象.

原文地址:https://www.jb51.cc/csharp/100159.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐