C#:Regasm, генерирующий записи реестра для каждого класса в моей COM DLL?

StackOverflow https://stackoverflow.com/questions/1016568

Вопрос

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

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

Например:

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

public class ClassToExpose {

     public void MethodToExpose() {}

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top