2009-06-19 2 views
3

Я пишу библиотеку классов (IE BHO) в C# и в настоящее время борюсь с большим объемом того, что, по моему мнению, является нежелательным результатом, исходящим из сгенерированных разделов реестра REGASM.C#: Regasm генерирует записи реестра для каждого класса в моей COM-библиотеке DLL?

Короткий вариант: я хочу показать только несколько классов (в настоящее время: ОДИН класс) в IE (и остальную часть COM). Только один класс имеет набор свойств ClassInterfaceAttribute и GUID, и я могу проверить, что для надстройки требуются только ключи реестра COM для этого класса, и, тем не менее, REGASM создает GUID и разделы реестра для каждого класса во всем проекте.

Это раздражает и несколько тревожит, так как я не хочу, чтобы мои имена классов сидели в реестре пользователей, если они не не имеют, чтобы быть там.

Чтобы быть справедливым, многие из этих других классов маркируются общественности, потому что я использую их в приложении драйвера из другого проекта в том же растворе, чтобы работать вокруг отладки черной дыры в IE ...

Я до сих пор очень зеленый для COM вообще (особенно относящийся к .Net), и мне было интересно, что лучший способ скрыть все мои другие классы от regasm? Или, по крайней мере, почему эти классы, которые, несмотря на то, что они отмечены как общедоступные, появляются, когда я не установил для них какой-либо из COM-флагов?

Спасибо!

+0

Как уже упоминалось здесь: http: // stackoverflow.com/questions/1099067/deploy-of-a-browser-helper-object, который вам действительно не нужно использовать .NET для создания расширений Internet Explorer. Это хорошо для прототипирования, но не следует развертывать на клиентских машинах. – EricLaw

ответ

5

Использовать internal модификатор доступа для материала, который не нуждается в модификаторе public. Для вещей, которым действительно нужен public, используйте атрибут ComVisible, чтобы частично скрыть его.

Например:

[ComVisible(false)] 
public class ClassToHide { 
    //whatever 
}; 

public class ClassToExpose { 

    public void MethodToExpose() {} 

    [ComVisible(false)] 
    public void MethodToHide() {} 
}; 

Все функции-члены и переменные-члены всех общественных классов COM-отображается по умолчанию. Поэтому сначала подумайте о том, чтобы сделать их внутренними, и если вы действительно нуждаетесь в них, они скрывают их от COM с ComVisible.

+0

Просто хотел, чтобы вы знали, что это работает как шарм. Спасибо :-) Я заметил, однако, что директива ComVisible, казалось, игнорировала перечисление внутри класса ... не была серьезной проблемой, но я счел ее несколько странной. –

2

Попробуйте использовать переключатель/regfile - это приведет к выходу файла reg, а не непосредственно записи всех имен классов в реестр.

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

Фактически, если у вас нет доступа к исходному коду, это был бы единственный способ достичь этого.

+1

Атрибут ComVisible - это решение для этого. То, что вы предлагаете, является обходным решением для случая, когда исходный код недоступен. – sharptooth

+0

К сожалению, это означает, что вручную выбирая выход .reg с каждой основной сборкой и/или записывая что-то для этого. Это то, что я уже делаю: -/Спасибо. –

+0

@sharptooth: Спасибо, что указали это. Исправленный. – Dan

2

Я написал COM-компонент с теми же проблемами.

Я отделил все функции, отличные от COM, в отдельную вспомогательную DLL. COM-библиотека содержит только код, который необходимо зарегистрировать. Все остальное доступно через вспомогательную DLL.

Я нашел, что простой способ убедиться, что будущий код не будет случайно помечен как public, а не internal и появится в реестре.

1

Установите атрибут ComVisible в false в файле AssemblyInfo и установите применимый ComVisible только для желаемых классов.

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

  • Нет связанных вопросов^_^