Зарегистрировать для взаимодействия com не активна visual studio
Это основная проблема:
- Visual Studio 2022 - 64-битное приложение
- При сборке с Visual Studio 2022 запускается 64-разрядная версия MSBuild.
- 64-разрядная версия MSBuild вызывает 64-разрядную версию RegAsm, которая регистрирует компонент как 64-разрядный компонент COM.
Поскольку большинство приложений на основе COM в реальном мире являются 32-разрядными приложениями, это, скорее всего, не то, что вам нужно.
Хотя это явно сделано по дизайну, я считаю, что это неудачный выбор дизайна, и я открыл проблема в сообществе разработчиков. Если вы согласны со мной, это может помочь повысить голосование по этому вопросу.
- снятие отметки с опции «Зарегистрироваться для COM-взаимодействия»
- заменив его на событие post-build-event для запуска 32-битной версии RegAsm
Это команда, которую я определил как событие после сборки:
Это приводит к ошибке MSB3073 и тексту «Команда . завершилась с кодом 123».
Полностью выходная строка выглядит так:
Я пробовал несколько вариантов этой команды, но не нашел подходящего определения.
Кто-нибудь знает точную команду, которую я должен ввести на этапе после сборки?
Получите ли вы дополнительную информацию, когда запустите команду вручную в командной строке? (может быть, есть подробный вариант?)
«Большинство приложений на базе COM в реальном мире - это 32-битные приложения» - это не так. Сейчас существует множество 64-битных приложений COM (как и все приложения Microsoft для начинающих). В любом случае снятие отметки + сборка публикации должна работать, но команда должна быть "% Windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ regasm.exe" (с \ после windir%)
Он должен работать. Обратите внимание, что цитаты в вашем вопросе кажутся забавными. Или опубликуйте воспроизводимый проект, чтобы мы могли убедиться, что не удалось.
Вы абсолютно правы, что очень наблюдательны с вашей стороны. Большое Вам спасибо. Клянусь, вы не видите этого на страницах свойств Visual Studio. Я смог увидеть это, когда открыл файл .csproj в редакторе. Первоначально я скопировал команду из страницу, которую я упомянул в вопросе. Эта страница также содержит неправильные символы.
1 ответ
Ошибка была довольно глупой и полностью моей виной.
Если вам нужно сгенерировать файл библиотеки типов, вы должны использовать команду
Если вы хотите отредактировать его прямо в файле проекта, вы можете использовать
Как заметил Саймон Мурье, я изначально использовал неправильные кавычки. Оказывается, я использовал двойной кавычки справа, Unicode 0x201D вместо обычный кавычки, Unicode 0x0022.
На мой взгляд, в Visual Studio вы не увидите разницы в свойствах проекта.
Причина, по которой у меня была эта ошибка, заключалась в том, что я изначально скопировал команду
А именно - завернуть класс в COM.
То есть классы в библиотеке должны реализовывать интерфейсы. И интерфейс и класс должны иметь уникальные Guid.
Реализовать интерфейс - тут всё ясно.
Где взять уникальный Guid - пока непонятно (не придумывать же самому?).
Опция - Register for COM interop (Зарегистрировать для взаимодействия с COM) не активна/не доступна (серый цвет). Как её включить непонятно.
Комбинация С++ с другими языками
Здравствуйте, я изучаю программирование сравнительно недавно, но уже знаком с.
Взаимодействие С++ с другими языками
Доброго времени суток. Возник такой вопрос, можно ли написать код например для работы с OLE, скажем.
Именно придумать самому. В студии даже есть такая функция, которая вам от балды сгенерирует GUID.
useruser, надо понимать, что ваша сборка управляемая и вызывать из неё код из неуправляемых языков. затруднительно.
useruser, дополню Usaga.
Шарп - это язык для платформы Net.
И сборки Шарпа рассчитаны на использование внутри этой платформы.
Для языков "не знающих" о Net, на мой взгляд, лучше делать библиотеки на С++.
Намного проще такую библиотеку подключить к Net проекту чем наоборот.
Добавлено через 5 минут
Даёт со всеми которые могут использовать COM.
Но выглядит это довольно абсурдно.
Net это более высокоуровневый слой по отношению к COM.
И как то принято, что высокоуровневневые обращаются к низкоуровневым, а не наоборот.
У высокоуровневых всегда бывают средства обратиться "вниз".
А вот "нижние" ничего о "верхних" не знают и, соответственно, не имеют инструментов для обращения "вверх".
Добавлено через 1 минуту
Лучше хорошенько обдумайте свою задачу.
Мне кажется вы выбрали неверный подход к реализации.
Сделайте библиотеку на Плюсах и, если надо, к ней оболочку из Net библиотеки.
Это намного проще и логичнее.
Такие вещи обычно назначаются. Странный подход. А вдруг (и что если) GUID совпадет? Шансов мало, но вероятность есть.
useruser, DLL - в контейнер, по сути. Какой архитектуры там код, по каким правилам сформирован, ничего этого не вырезано в камне. Вы с таким же успехом можете обвинить Майкрософт в том, что из Си нельзя вызвать метод класса на С++.
Да, это так.
Но Net это надстройка над COM.
В этом есть как плюсы так и минусы.
И если создатели каких-то языков не хотят этой надстройкой пользоваться, то что с этим сделаешь?
Значит они считают, что для их языка минусы Net перевешивают её преимущества.
Получить доступ из надстройки к основанию чаще всего проблем не составляет.
А вот обратное редко предусматривается и обычно вызывает кучу геморроя.
По сути, что вы хотите сделать: создатели языка (того или иного) сознательно отказались использовать CLR так как считают, что для их языка это плохо.
Вы хотите обойти это ограничение и через костыли "прикрутить" CLR.
Такой подход вызывает большие сомнения.
Намного логичнее создать единую COM библиотеку, а для Шарпа и других Net языков сделать дополнительную Net оболочку над этой COM библиотекой.
Это логичнее, прозрачнее, проще.
Добавлено через 2 минуты
useruser, я не знаком с C++/CLI.
Возможно на нём можно сразу создать общую COM и Net библиотеки.
И тут не столько важны технические детали, сколько важен подход и политика компании Майкрософт. Компания не маленькая, NET 20 лет и мы видим, что остальные языки как бы говоря не поддерживают эту технологию. То есть Embarcadero Technologies (Delphi) "забила" на NET от Майкрсофт?
Языкам и технологиям 20 лет, крупнейшие компании, куча ПО..
Это не проблема. Это - особенность.
Добавлено через 8 минут
Выбирая технологии майкрософт, я надеюсь на то, что эта компания обеспечит максимальную совместимость и работоспособность их продуктов и продуктов разработанных с помощью их ПО на своих операционных системах.
Но похоже, что это не так.
Странно, что майкрософт не принуждает сторонние компании (Embarcadero Technologies, Sun, The Qt Company. ) использовать какой либо единый "стандарт библиотек" (образно говоря).
То есть я сейчас должен "подстраиваться" под Embarcadero Technologies (производить дополнительные действия с библиотекой или использовать COM), а не Embarcadero Technologies под меня. И всё это на Windows системах.
Не смотря на все теории заговора MS, вообще, редко кого-то к чему-то принуждает.
Сравните её политику и политику Apple.
Они создали CLR (виртуальная машина) для унификации приложений и для реализации приложений для CLR платформу Net.
Могу путать, что для кого, но это сильно связанные между собой вещи.
Но заставить всех использовать его и отказаться от других платформ - это вряд ли понравилось пользователям.
Разработчик языка должен выпустить версию своего языка под CLR.
Для Плюсов и VB они сами сделали такие версии.
А другие компании сами решают следует ли им создавать версию своего языка для CLR.
Добавлено через 2 минуты
А с учётом того, что CLR по сути это мультиплатформенная машина, то заставить её использовать в других ОС, вообще, невозможно.
Можно рекламировать, пропагандировать использование CLR - чем MS и занимается.
И что вы хотите про неё вспомнить?
Вы можете сейчас хоть DOS использовать.
MS отказалась от поддержки старых ОС так как ей это экономически не выгодно.
Но она же не сделала их неработоспособными.
Используйте сколько душе угодно, но только на свой страх и риск.
А требовать от компании вкладывать деньги в то, что ей коммерчески не нужно.
Последствия такого хода бы негативно повлияло на компанию. Миллионы организаций бы пострадали и задумались об использовании продуктов MS. А будь их воля, они бы пересадили всех на 10ку и неотключаемыми обновлениями и принудительной перезагрузкой
Причин может быть множество.
И вряд ли здесь место для их обсуждения.
По факту - MS никого не заставляет использовать её новые решения и отказываться от старых.
А будь их воля, они бы пересадили всех на 10ку и неотключаемыми обновлениями и принудительной перезагрузкой
Они и так фактически сделали это. 7-ка уже не поддерживается, и ее пользователям Microsoft настоятельно рекомендует перейти на современную 10-ку. Которая хозяйничает на компе за деньги пользователя, навязывает свои платные продукты и вынуждает (по другому не могу назвать это нововведение) зарегистрировать аккаунт Microsoft, всех кого сможет вынудить.
Но у Google все еще печальнее, там хозяин смартфона, вовсе и не хозяин своему смартфону, только числится. Для безопасности конечно жи, так сделано.
И не одни они такие. Принтер сейчас не хочет работать без регистрации, хотя за него уплачены деньги. Но надо еще установить себе на комп каку и согласиться с лицензионным соглашением на 150 стр, суть которых у всех одна и та же - Мы собираем ваши данные. А нельзя ли просто продать мне принтер и не шариться на моем компе?
Так Microsoft на этом фоне выглядит вполне еще прилично. По крайней мере оставляет возможности отказаться от разного мусора, хотя и муторно, а часть вообще поудалять.
Да и альтернатив как то нет под стандартные пользовательские задачи.
В .NET есть такое понятие как сборка (assembly) и внутри это далеко не "классическая" DLL, несмотря на то, что обладает таким же расширением файла.
Компоненты с другими языками
Интересно, есть ли для Lazarus модули или компоненты, которые позволяют вставлять в программы куски.
Совместим ли Haskell с другими языками?
Очень заинтересовался функциональным программированием, даже несколько простых примеров разобрал. .
ASP по сравнению с другими языками
Ну вот. Свершилось. Наступили тяжелые времена! Мне, человеку поклоняющемуся Юникс, веб-серверу.
Связь пролога с другими языками программирования
Необходимо связать код на прологе с другими языками програмиирования. Я так понимаю надо сделать.
В чем преимущество языков Джава перед другими языками
Здравствуйте, форумчане. Подскажите - в чем преимущество языков Джава перед другими языками .
Преимущества языка VBScript - перед другими языками программирования
Добрый вечер, господа программисты. Дайте ответ новичку в сфере программирования. В чем (в двух.
Классы могут быть обрабатываются только COM-взаимодействием и всегда обрабатываются как интерфейсы. Иногда интерфейс, используемый для маршалинга класса, называют интерфейсом класса. Сведения о переопределении интерфейса класса выбранным интерфейсом см. в разделе Вызываемая оболочка COM.
Если вы планируете предоставлять доступ к сторонним типам COM другим приложениям, всегда используйте основную сборку взаимодействия, предоставленную тем же издателем, что и определяемая ею библиотека типов. Помимо обеспечения гарантированной совместимости типов, основные сборки взаимодействия часто настраиваются поставщиками так, чтобы оптимизировать взаимодействие.
Даже если вы не планируете предоставлять доступ к сторонним типам COM, использование основной сборки взаимодействия может упростить задачу взаимодействия с COM-компонентами. Однако такая стратегия не обеспечивает изоляции от изменений, которые поставщик может вносить в типы, определенные в основной сборке взаимодействия. Если приложению требуется такая изоляция, создайте собственную сборку взаимодействия вместо использования основной сборки взаимодействия.
Вам необходимо зарегистрировать все полученные основные сборки взаимодействия на своем компьютере, прежде чем вы сможете ссылаться на них в Visual Studio. Visual Studio ищет основную сборку взаимодействия и использует ее при первой ссылке на тип из библиотеки типов COM. Если программа Visual Studio не может найти основную сборку взаимодействия, связанную с библиотекой типов, она предлагает приобрести ее или создать сборку взаимодействия. Средство импорта библиотек типов (Tlbimp.exe) также использует реестр для обнаружения основных сборок взаимодействия.
Если вы не планируете использовать Visual Studio, регистрировать основные сборки взаимодействия необязательно, однако регистрация предоставляет два преимущества.
Для регистрации основной сборки взаимодействия используется средство регистрации сборок (Regasm.exe).
В командной строке введите следующее:
regasmимя_сборки
В этой команде имя_сборки — это имя файла регистрируемой сборки. Программа Regasm.exe добавляет запись об основной сборке взаимодействия в тот же раздел реестра, что и для исходной библиотеки типов.
Пример
В примере ниже регистрируется основная сборка взаимодействия CompanyA.UtilLib.dll .
Упаковка взаимодействия
Экспорт строк Fixed-Length в неуправляемый код
Экспорт иерархий наследования
Иерархии управляемых классов выравниваются при предоставлении в виде COM-объектов. Например, если определить базовый класс с элементом, а затем наследовать базовый класс в производном классе, предоставляемом в виде COM-объекта, клиенты, использующие производный класс в COM-объекте, не смогут использовать наследуемые члены. Доступ к членам базового класса возможен из COM-объектов только в качестве экземпляров базового класса, а затем только в том случае, если базовый класс также создается как COM-объект.
Перегруженные методы
хотя можно создавать перегруженные методы с Visual Basic, они не поддерживаются COM. Если класс, содержащий перегруженные методы, предоставляется в виде COM-объекта, для перегруженных методов создаются новые имена методов.
Например, рассмотрим класс с двумя перегрузками Synch метода. Если класс представлен в виде COM-объекта, новые имена создаваемых методов могут быть Synch и Synch_2 .
Переименование может привести к двум проблемам для потребителей COM-объекта.
Клиенты могут не ожидать имен создаваемых методов.
Созданные имена методов в классе, доступном в виде COM-объекта, могут изменяться при добавлении новых перегрузок в класс или его базовый класс. Это может вызвать проблемы с версиями.
Чтобы решить обе проблемы, присвойте каждому методу уникальное имя, а не использование перегрузки при разработке объектов, которые будут предоставлены в виде COM-объектов.
Использование COM-объектов с помощью сборок взаимодействия
Сборки взаимодействия используются почти так же, как если бы они находились под управляемым кодом для объектов COM, которые они представляют. Однако поскольку они являются оболочками и не являются реальными COM-объектами, между использованием сборок взаимодействия и стандартных сборок существуют некоторые различия. Эти области различий включают раскрытие классов и типы данных для параметров и возвращаемых значений.
Классы, предоставляемые как интерфейсы и классы
В отличие от классов в стандартных сборках, классы COM доступны в сборках взаимодействия как интерфейс и класс, представляющий COM-класс. Имя интерфейса идентично имени класса COM. Имя класса взаимодействия совпадает с именем исходного класса COM, но с добавленным словом «class». Например, предположим, что имеется проект со ссылкой на сборку взаимодействия для COM-объекта. Если класс COM называется MyComClass , IntelliSense и обозреватель объектов отображают интерфейс с именем MyComClass и класс с именем MyComClassClass .
Однако при использовании класса COM в качестве основы для производного класса необходимо использовать класс взаимодействия, представляющий COM-класс, как показано в следующем коде:
Сборки взаимодействия неявно реализуют интерфейсы, представляющие COM-классы. Не пытайтесь использовать Implements оператор для реализации этих интерфейсов, иначе возникнет ошибка.
Типы данных для параметров и возвращаемых значений
Методы COM уровня модуля
Необработанные ошибки в обработчиках событий
В этом примере возникает ошибка, как ожидалось. Однако при попытке выполнить тот же пример без Try. Catch. Finally блока ошибка игнорируется, как если бы использовалась OnError Resume Next инструкция. Без обработки ошибок деление на ноль автоматически завершается сбоем. Так как такие ошибки никогда не вызывают ошибки необработанных исключений, важно использовать некоторую форму обработки исключений в обработчиках событий, обрабатывающих события из COM-объектов.
Общие сведения об ошибках COM-взаимодействия
Без обработки ошибок вызовы взаимодействия часто создают ошибки, которые предоставляют небольшую информацию. По возможности используйте структурированную обработку ошибок, чтобы предоставить дополнительные сведения о проблемах, возникающих при их возникновении. Это может быть особенно полезно при отладке приложений. Пример:
Вы можете найти такие сведения, как описание ошибки, HRESULT и источник ошибок COM, изучив содержимое объекта исключения.
проблемы с контролем ActiveX
Элемент управления Frame в Microsoft Forms 2,0
Up-Down элемент управления, также известный как элемент управления "Счетчик"
Элемент управления вкладки Шеридан
существует несколько обходных путей для неподдерживаемых проблем с управлением ActiveX. можно перенести существующие элементы управления в Visual Studio, если вы владеете исходным исходным кодом. В противном случае можно проверить наличие обновленных поставщиков программного обеспечения. NET-совместимые версии элементов управления для замены неподдерживаемых ActiveX элементов управления.
Передача свойств элементов управления только для чтения по ссылке ByRef
Если у вас есть доступ к вызываемой процедуре, можно предотвратить эту ошибку с помощью ByVal ключевого слова, чтобы объявить параметры, принимающие ReadOnly Свойства. Пример:
Если у вас нет доступа к исходному коду для вызываемой процедуры, можно принудительно передать свойство по значению, добавив дополнительный набор квадратных скобок вокруг вызывающей процедуры. например, в проекте, который содержит ссылку на COM-объект библиотеки Microsoft объекты данных ActiveX 2,8, можно использовать:
Развертывание сборок, предоставляющих взаимодействие
Развертывание сборок, предоставляющих интерфейсы COM, представляет некоторые уникальные проблемы. Например, потенциальная проблема возникает, когда отдельные приложения ссылаются на одну и ту же сборку COM. Такая ситуация часто возникает при установке новой версии сборки, если другое приложение по-прежнему использует старую версию сборки. При удалении сборки, использующей общую библиотеку DLL, можно непреднамеренно сделать ее недоступной для других сборок.
Чтобы избежать этой проблемы, следует установить общие сборки в глобальный кэш сборок (GAC) и использовать установочного модуля для компонента. Если вы не можете установить приложение в глобальном кэше сборок, его следует установить на Коммонфилесфолдер в подкаталоге, относящемся к конкретной версии.
Сборки, которые не являются общими, должны располагаться рядом в каталоге с вызывающим приложением.
Я использую Visual Studio 2015. Я успешно создал библиотеку классов и выбрал:
Затем мне удалось развернуть это с помощью проекта установки для других пользователей, и он отлично работает (хотя до сих пор не понимаю, почему Intellisense не работает для него)
Теперь я пытаюсь сделать то же самое для приложения WinForms, но
не применимо, оно выделено серым цветом — должно ли оно быть? И если да, то почему я не могу зарегистрировать приложение для COM-взаимодействия, чтобы иметь возможность манипулировать им в других приложениях? (например, в Excel VBA)
Проблема в том, что регистрация com обычно имеет смысл только для сборок (.dll), а ваше приложение WinForm обычно является исполняемым файлом (.exe).
Итак, в этом случае вы должны создать dll и переместить все функции и классы, которые должны быть видны в этой сборке. Затем сделайте его видимым для Com и используйте его также из исполняемого приложения WinForms.
Спасибо за ответ. Я вроде как понял, что, когда я создал новую библиотеку классов, и было нормально помещать туда формы . просто кажется, что winFormApp по умолчанию не позволит этого - я думаю, что теперь понимаю, почему. Спасибо!
С другой стороны, приложение WinForms запускается как отдельная программа и не предназначено для совместного использования другими приложениями.
В этом случае вы можете создать проект библиотеки классов и создать пользовательский элемент управления WinForms в проекте и предоставить UserControl его другим приложениям, сделав его COM-видимым.
Вот старый пример , как ни странно, в моем поиске трудно найти более свежие примеры.
Поэтому я никак не могу создать файл .exe, который мог бы использовать COM. Причина, по которой я спрашиваю, заключается в том, что я хотел бы закодировать пароль в приложении в защищенной онлайн-зоне, через которую люди могут отправлять информацию. Я могу создать столько библиотек, сколько захочу, но мне действительно нужно мое клиентское приложение для доступа к серверному приложению, и я надеялся, что оно сможет сделать это через COM. но я не думаю, что это возможно.
Вы можете задать новый вопрос для этого требования, могут быть разные возможные способы выполнить требование, не обязательно COM.
Читайте также: