Как создать универсальную библиотеку использования - PullRequest
1 голос
/ 23 декабря 2010

У меня есть пользовательский элемент управления редактора изображений (c # .net v2.0).Его используют на тысячах компьютеров в качестве компонента activex.Я хочу, чтобы компонент также был доступен для оконных форм и возможного другого использования.

Для использования activex я добавляю тег <object> в html-код и вызываю компонент с помощью clsid (статический guid).Так что, если я создаю и распространяю более новую версию, она работает без изменения какого-либо клиентского кода.

Я хочу, чтобы формы Windows могли использовать те же распределенные библиотеки.И они не должны ссылаться на конкретную версию, поэтому я могу обновить компонент без изменения программ, которые его используют.

Я использую regasm для регистрации на com.Но я не знаю, как ссылаться на него из Visual Studio (например, ссылаться на clsid?)

Может быть в Visual Stuido, когда я выбираю «Добавить ссылку» и выбираю вкладку «COM», я должен увидеть свой компонент в списке.

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

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\tlbexp" ImageEditorComp.dll /out:ImageEditorComp.tlb
regasm /tlb:ImageEditorComp.tlb ImageEditorComp.dll
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\gacutil" /I ImageEditorComp.dll

Любые предложения приветствуютсяС уважением

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

Это невозможно, вы вызовете печально известную и страшную проблему DLL-ада.Строгое холодное жесткое правило в COM состоит в том, что у вас есть для изменения значений атрибута [Guid] в открытых интерфейсах, когда вы вносите существенное изменение либо в общедоступные интерфейсы, либо в их реализацию.Изменение направляющих гарантирует, что вы не перезаписываете ключи реестра старой версии вашего компонента при использовании Regasm.exe.Существующие программы, использующие ваш компонент и не перекомпилированные для использования последней версии, продолжат работать без проблем.Типичным результатом DLL Hell является неприятное аппаратное исключение, такое как AccessViolation, очень , которое трудно устранить.

Ничто из этого не применимо в вашем конкретном случае здесь.Нет смысла пытаться использовать компонент через COM.Это сборка .NET, просто добавьте ссылку на нее напрямую.Фактически, среда IDE не позволит вам добавить ссылку на библиотеку взаимодействия.Но не .tlb.GAC удерживает вас от ада DLL, если вы правильно увеличиваете [AssemblyVersion].

0 голосов
/ 27 декабря 2010

Я нашел решение.

Чтобы объяснить шаг за шагом:

1- Создайте компонент со всеми необходимыми свойствами для com. (Подпишите сборку, используйте интерфейсы для com, сделайте сборку com видимой)

На клиентской машине

2- Зарегистрируйте сборку с помощью regasm (я тоже рекомендую добавить флажки безопасности).

3 - добавить сборку в глобальный кеш с помощью gacutil (или установщика msi)

Я выяснил, когда вы вызываете конкретную версию сборки, gac ищется в первую очередь, поэтому, если она установлена ​​в GAC, ссылочный путь кодовой базы никогда не используется.

При использовании в качестве activeX вы обращаетесь к компоненту с GUID. Поскольку regasm добавляет имя сборки и версию, которую представляет GUID, веб-браузер напрямую использует компонент из GAC.

При использовании из настольного приложения, непосредственно обращаться к сборке и установить для свойства copylocal значение false. Аналогично, в клиентской машине окна найдут сборку, расположенную в самом GAC.

Вот полезная ссылка на эту тему.

http://www.simple -talk.com / DotNet / видео-студия / наращивание и развертывание систем-а-.net-COM-сборки /

Надеюсь, это сэкономит время других людей :) 1026 *

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