我正在进行一些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
,如果这能唤起一些回忆的话。