gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:34:20 24 4
gpt4 key购买 nike

我正在做一些 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,如果它触发任何内存的话。

最佳答案

将评论复制到答案以保留它:

Those pages are correct. Ideally the type library exporter would payattention to a [TypeLibType] attribute, but it doesn't. It is not likeyou can't get it, but it is error-prone and very hard to automate.Decompile the .tlb file with Oleview.exe, File > View TypeLib,copy/paste the decompiled idl and edit in the [appobject] attribute,rebuild the .tlb with midl.exe /tlb. The workaround in VBA is mucheasier. Fwiw, GlobalMultiUse is something completely different,affects only the REGCLS that an out-of-process server uses.

– Hans Passant 2018 年 5 月 4 日 13:05


OP 声明此评论是正确的。

关于c# - 如何使 C# Com 对象成为 GlobalMultiUse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174976/

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