2017-01-20 2 views
0

В настоящее время я нахожу COM-видимый компонент (фактически вне процесса exe).Как написать Enums в VB.NET в видимом компоненте COM

Мой вопрос: как правильно делать перечисления.

Я просто это в моем интерфейсе

<ComVisible(True)> _ 
Enum TestTypes 
    TestType1 = 1 
    TestType2 = 2 
    TestType3 = 3 
End Enum 

То, что я вижу в том, что в обозревателе объектов каждый элемент TestTypes_TestType1 т.д.

Image of what I see in the Browser Normally Enums look like this.

+0

Что еще вы ожидаете увидеть? – cyboashu

+0

Я добавил 2 фото. Один показывает, что я вижу, и показывает другие перечисления. – darbid

+0

com callable wrappers не будут идеально отражать то, что вы видите в .NET при использовании в COM-среде, потому что COM-технология действительно старая и ограничена в том, что она может делать по сравнению с управляемой средой программирования .net. Что не так с этими именами? Я не думаю, что с ними что-то не так ... они работают, не так ли? –

ответ

2

Это старая, старая проблема с перечислениями, датированная как минимум на языке C. Язык, в котором члены перечисления добавляются в глобальное пространство имен. Должен быть вам знаком, VBA тоже это делает. Это довольно уродливая проблема, очень мало масштабируется в больших программах. Значение .NET enum как FileShare.Read не может быть экспортировано как Read. Почти гарантированно возникает имя идентификатора или столкновение ключевых слов.

Два основных трюка используются программистами, чтобы избежать таких столкновений. Общее в C - это верхний регистр члена перечисления. Конечно, не будет хорошо работать на языке, таком как VB. И другой трюк - префикс короткая строка.

Уловка, которую вы видите, используется автором библиотеки типа ADODB, он префикс dbUse. И это трюк, который, как вы видите, используется экспортером библиотеки .NET, он префикс имени типа перечисления. И важно, чтобы вы поняли, что используете трюк, вы префикс Test. Возможно, что-то, что вы сделали, не осознавая этого, вы просто привыкли к этому.

Но это больше не является необходимым или необходимым в VB.NET. Гораздо более разумным способ, чтобы написать, что это перечисление:

<ComVisible(True)> _ 
Enum Test 
    Type1 = 1 
    Type2 = 2 
    Type3 = 3 
End Enum 

И вы бы использовать, скажем, Test.Type1 вместо уродливой тавтологии TestTypes.TestType1 в коде VB.NET.

И теперь экспортер библиотеки типов производит гораздо более приятные имена членов перечисления, такие как Test_Type1.

Вы не можете избавиться от подчеркивания без серьезной операции, вам придется писать декларации в IDL (как это сделал ADODB-автор) и импортировать библиотеку типов, сгенерированную MIDL, обратно в вашу программу. Не совсем стоит хлопот.

0

Что вы видите совершенно нормально: генератор typelib .NET всегда префикс полей enum с соответствующим именем перечисления. Если вы хотите переопределить это поведение, вам нужно вручную отредактировать поля внутри файла IDL и воссоздать библиотеку типов. См. Ссылку this для получения более подробной информации.

+0

Спасибо, Аврора, мои поисковые запросы Google не нашли эту ссылку, которая бы спасла меня, если бы у меня был вопрос. – darbid

Смежные вопросы