Я взял мою сборку .NET, использовал OleView для генерации файла IDL, теперь использую
midl /header MyAssembly.h MyAssembly.tlb
создать заголовочный файл для использования в действительно старом COM-проекте.
Теперь MyAssembly.dll ссылается на MyAssembly.Core.dll — поэтому я создал файл IDL для MyAssembly.Core.dll, а также mscorlib.dll и успешно сгенерировал мои файлы .i_c и .h из midl для всех трех.
Проблема в том, что файлы .h не содержат пространства имен! Я получаю вывод, как это:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE DoThing(
/* [in] */ MyEnums MyEnum) = 0;
когда я ожидаю увидеть:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE DoThing(
/* [in] */ MyAssembly_Core::MyEnums MyEnum) = 0;
MyAssembly.idl:
import "MyAssembly.Core.idl";
[
uuid(1ED54182-DF43-4FF4-9887-1C105E50427D),
version(1.0),
custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "MyAssembly, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null")
]
library MyAssembly
{
// TLib : // TLib : : {515919C5-1821-44B6-8B7A-C42045E2483A}
importlib("MyAssembly.Core.tlb");
// TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
importlib("mscorlib.tlb");
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
(the rest of the idl)
И MyAssembly.Core.dll:
import "mscorlib.idl";
[
uuid(515919C5-1821-44B6-8B7A-C42045E2483A),
version(1.0),
custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "MyAssembly.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
]
library MyAssembly_Core
{
// TLib : // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
importlib("mscorlib.tlb");
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
typedef [uuid(E01EAD76-4F8F-4B76-AF58-FCC03609EB61), version(1.0),
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "MyAssembly.Core.MyEnums")
]
enum {
MyEnum_UNKNOWN = 0xffffffff,
MyEnum_One = 1,
MyEnum_Two = 2
} MyEnums;
(the rest of the idl)
Наконец, mscorlib.idl:
#if (__midl >= 800)
midl_pragma warning(disable: 2362)
#endif
[
uuid(BED7F4EA-1A96-11D2-8F08-00A0C9A6186D),
version(2.4),
helpstring("mscorlib.dll"),
custom(90883F05-3D28-11D2-8F17-00A0C9A6186D, "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
]
library mscorlib
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");
(the rest of the idl)
Я что-то здесь упускаю, я просто не уверен, что.
Так как же заставить IDL генерировать правильные пространства имен для выходных заголовочных файлов?
Спасибо,
Задача ещё не решена.
Других решений пока нет …