C #: Regasm генерирует записи реестра для каждого класса в моей COM DLL? - PullRequest
3 голосов
/ 19 июня 2009

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

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

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

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

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 19 июня 2009

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

Например:

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

public class ClassToExpose {

     public void MethodToExpose() {}

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

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

2 голосов
/ 22 июня 2009

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

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

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

2 голосов
/ 19 июня 2009

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

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

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

1 голос
/ 03 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...