Я делаю проект COM-взаимодействия. Подстановка некоторых проектов VB и C ++ ATL COM в C # и .NET Interop. Когда я определяю перечисления в .NET, и они становятся ComVisible, они отображаются как Typelib.EnumType_EnumValue вместо просто Typelib.EnumValue. Экспортер typelib делает это для обеспечения уникальности имен значений. Но я знаю, что все мои перечисления уникальны, поэтому я не хочу подчеркивания. Также есть много клиентского кода, который нужно изменить, если я не избавлюсь от подчеркивания.
Чтобы найти решение этой проблемы, я определил перечисления в IDL-файле и из этого создаю взаимодействие typelib и .Net.
[
uuid(64893FD4-359D-46B9-BC1E-48C055796104),
version(1.0),
helpstring("ABC"),
helpfile("AAA.chm"),
helpcontext(0x00000001)
]
library EnumTypeLib
{
importlib("stdole2.tlb");
typedef [uuid(8FF85069-C4E2-4540-A277-4C0F3C19B807), helpstring("MyEnum"), helpcontext(0x00000066)]
enum MyEnum {
Value1 = 0,
Value2 = 1,
} MyEnum;
};
Я создаю библиотеку типов с помощью MIDL.exe, который создает tlb-файл.
И я создаю сборку с помощью tlbimp.exe. подписать сборку тем же ключом, что и другие сборки Interop.
tlbimp OpenStructureAdapterEnum.tlb /keyfile:KeyFile.snk
Затем я регистрирую сборку с помощью regasm.exe.
Эта сборка выглядит хорошо и содержит перечисление без подчеркивания. Но проблема в том, что невозможно увидеть COM-библиотеку из OLE / COM Object Viewer или из VBA или VB6. И когда я ссылаюсь на enum из другой доступной COM сборки, часть интерфейса, содержащая ссылки на enum, становится доступной как ограниченные методы.
[restricted] void Missing7();
[restricted] void Missing8();
[restricted] void Missing9();
[restricted] void Missing10();
Как создать библиотеку COM, содержащую только перечисления (без подчеркиваний) и ссылаться на них из других сборок .net Interop?