Как вызвать код .NET (C# / vb.net) из vbScript?

Я полагаю, что могу скомпилировать C# DLL, а затем предоставить ее как COM-объект, чтобы его можно было CreateObject'd из VBscript. Я просто не уверен, что нужно сделать для этого ...

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
7 788
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны использовать утилиту regasm для регистрации сборки (точно так же, как вы делаете regsvr32 с COM-серверами). Затем вы можете использовать его из COM. Убедитесь, что он установлен в GAC. Материал должен иметь [ComVisible(true)], чтобы его можно было использовать из COM.

Для каждого проекта, который вы можете выбрать, есть опция «Доступен через COM». Затем, конечно, вы должны зарегистрировать сборку, чтобы использовать ее, но это все.


Мне пришлось немного поохотиться, чтобы найти его для C# (я привык к VB.Net), но вы можете найти этот вариант, дважды щелкнув папку Properties в обозревателе решений, выбрав вкладку Application и затем щелкнув Кнопка Assembly Information....

Ответ принят как подходящий

Это может быть очень просто. Но есть много мест, где не все так просто. Это во многом зависит от того, что нужно вашему классу, и как вы собираетесь его развернуть.

Некоторые вопросы, которые следует учитывать:

  • В вашем классе должен быть конструктор без параметров.
  • Он не может предоставлять статические методы.
  • Развертывание вашей COM-DLL в глобальном кэше сборок нормально? Если нет, вам придется дать ему строгое имя и зарегистрировать его с помощью regasm /codebase.
  • Вам все равно, какие идентификаторы GUID идентифицируют класс и его интерфейсы? Если нет, вы можете позволить regasm назначить их, но они будут разными каждый раз (и в каждом месте), когда класс регистрируется. Если вам нужно, чтобы идентификаторы GUID оставались неизменными при установке, вам необходимо пометить элементы с помощью атрибута Guid.
  • Собираетесь ли вы использовать маршалинг типов данных по умолчанию между .NET и COM? Если нет, вам нужно будет пометить свойства и методы атрибутом MarshalAs.
  • Имеет ли значение для вас, какой COM-интерфейс предоставляет ваш класс? Если это так, вам нужно будет иметь дело с атрибутом InterfaceType.
  • Вашему классу нужно поднимать или реагировать на события? Если это так, то это влияет на то, как вы проектируете интерфейс своего класса.

Есть очень хорошая (если и устаревшая) статья о COM-взаимодействии и .Net здесь. (Многие вещи, о которых говорится в статье, например, создание библиотек типов, теперь обрабатываются автоматически.) Документация Microsoft обновлен, но не настолько подробен.

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