如何使C# Com对象成为GlobalMultiUse?

3

我正在进行一些COM互操作(VBA客户端),并且有一个功能可能被我视为理所当然,如果在idl中使用idl属性appobject,则可以使用全局已实例化对象。 这适用于ATL / C ++,因此我可以编写以下IDL(ATL项目):

[
    uuid(183343ca-6154-4c1e-9a6b-927e5b279332),
    version(1.0),
]
library GlobalCOMObjectLib
{
    importlib("stdole2.tlb");

    [
        odl,
        uuid(f1bd66ae-4fc9-45a4-8a2b-60df31d9bcfe),
        version(1.0),
        dual,
        oleautomation
    ]
    interface ISampleGlobalObject : IDispatch
    {
        HRESULT Line([in]BSTR sIn, [out, retval] BSTR* outRetVal);
    };

    [
        uuid(6a905a18-37d2-4ac1-a663-871f7dc99af7),
        version(1.0),
        appobject 
    ]
    coclass SampleGlobalObject
    {
        [default] interface ISampleGlobalObject;
    };
};

然后在VBA中,我不需要创建coclass,可以按照以下方式编写:

Sub TestGlobal3()
    Debug.Print SampleGlobalObject.Line("hello")
End Sub

如何在C#中实现相同的功能,因为appobject作为属性未被识别(波浪线)。

namespace foo
{
    public interface ISampleGlobalObjectCSharp
    {
        string Line(string sLine);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ISampleGlobalObjectCSharp))]
    [appobject]
    public class SampleGlobalObject : ISampleGlobalObjectCSharp
    {
        string ISampleGlobalObjectCSharp.Line(string sLine)
        {
            return sLine;
        }
    }

在搜索过程中,遇到了一些关于从VB6转换到C#的文章,它们表明这是不可能的。VB6术语是GlobalMultiUse,如果这能唤起一些回忆的话。

1
那些页面是正确的。理想情况下,类型库导出器应该注意 [TypeLibType] 属性,但它没有这样做。虽然你可以获得它,但它容易出错且难以自动化。使用 Oleview.exe 反编译 .tlb 文件,选择“文件” > “查看类型库”,复制/粘贴反编译的 idl 并编辑 [appobject] 属性,用 midl.exe /tlb 重新构建 .tlb。在 VBA 中绕过这个问题要容易得多。顺便说一句,GlobalMultiUse 是完全不同的东西,只影响 out-of-process 服务器使用的 REGCLS。 - Hans Passant
@HansPassant:没错,那个有效。谢谢你,Hans。 - S Meaden
1个回答

0

复制评论到答案以保存它:

那些页面是正确的。理想情况下,类型库导出器应该注意 [TypeLibType] 属性,但它没有。你不是不能得到它,但这很容易出错,而且很难自动化。使用 Oleview.exe 反编译 .tlb 文件,选择“文件”>“查看类型库”,复制/粘贴反编译的 idl 并编辑 [appobject] 属性,在 midl.exe /tlb 中重新构建 .tlb。在 VBA 中的解决方法要简单得多。顺便说一句,GlobalMultiUse 是完全不同的东西,只影响一个 out-of-process 服务器使用的 REGCLS。

– Hans Passant May 4 '18 at 13:05


原帖作者表示此评论是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接