Проблема создания COM-библиотеки, содержащей только перечисления - PullRequest
3 голосов
/ 05 июля 2011

Я делаю проект 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?

Ответы [ 2 ]

1 голос
/ 14 октября 2013

Я сделал это:

В .NET я создал видимую COM-библиотеку с именем PermissionControlLib с таким перечислением:

public enum NetOperations
{
   Oper1,
   Oper2,
   Oper3
}

В VB6 я создал другое перечислениекак это:

Public Enum VBOperations
   Oper1=NetOperations.NetOperations_Oper1,
   Oper2=NetOperations.NetOperations_Oper2,
   Oper3=NetOperations.NetOperations_Oper3
End Enum

Использование:

Dim ud as PermissionControlLib.IUser
Set ud = New User
Dim b as Boolean
b = ud.HasPermissionInOperation(VbOperations.Oper1)
1 голос
/ 06 августа 2011

Чтобы ответить на ваш последний вопрос первым.То, что вы хотите, это TypeLib, а не библиотека COM.Если COM-интерфейс представляет собой набор указателей кода и функций, TypeLib - это карта для взаимодействия с этими указателями (наряду с определениями и перечислениями и множеством других вещей).Только когда они собираются вместе, есть библиотека COM.Поскольку нет COM-интерфейса, вы не можете иметь COM-библиотеку.

Microsoft предоставила пример того, как создать TypeLib без интерфейса .Это очень похоже на тот, который вы описали.Как вы заметите, в нем нет COM-интерфейса;и из-за этого он должен оставаться непритязательным TypeLib.

Следующая проблема - сборка .NET.Когда вы используете TlbImp.exe для импорта перечислений в ваш код, это позволяет вам использовать эти перечисления в вашем коде - внутри вашей сборки.Это предел того, что вы можете сделать с перечислениями.Вы не можете экспортировать эти перечисления, потому что они не принадлежат вашему .NET-коду.Перечисление принадлежит TypeLib.Ваш код .NET имеет разрешение на использование перечисления, но не может претендовать на владение перечислением.

Наконец, чтобы ответить на ваш первый вопрос.Вам необходимо использовать функции, предоставляемые .NET.Он имеет возможность определять перечисления и экспортировать их и сделать их видимыми из COM.Хотя я понимаю разочарование по поводу соглашения об именах, это не то, что вы должны попытаться обойти или обойти.Как вы уже видели, попытка обойти эту незначительную проблему с соглашением об именах привела к серьезным проблемам, в результате чего ваш новый код стал непригодным для использования.

...