Я выполняю 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 мне не нужно Новый кокласс я могу написать следующее
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
, если это вызывает какие-либо воспоминания.