Настройка компонентов на основе .NET для активации без регистрации - PullRequest
5 голосов
/ 19 января 2010

Я пытался заставить работать без библиотек COM DLL на основе .NET, но безуспешно.

  • В Visual Studio 2008 я добавил новую библиотеку классов C #.
  • Я включил опции «сделать сборку COM-видимой» и «зарегистрировать для взаимодействия COM».
  • Я добавил общедоступный интерфейс и класс с некоторыми функциями.
  • Я добавил манифестную зависимость в мое клиентское приложение C ++: #pragma comment (linker, "/ manifestdependency ...

Но когда я запускаю свое приложение, я получаю «приложение не удалось запустить из-за неправильной конфигурации приложения».

Я использовал инструмент mt от Microsoft для извлечения файлов манифеста как клиентского приложения C ++, так и DLL-библиотеки C # COM, и информация в них одинакова (узел variableAssembly в файле манифеста C ++ содержит то же имя и версию, что и AssemblyIdentity в файле манифеста COM).

Я также попробовал подход, описанный в http://msdn.microsoft.com/en-us/library/eew13bza.aspx, но с похожими результатами.

Аналогичным образом я попытался добавить ссылку на мой COM-проект в «Framework and References» моего клиентского приложения C ++. Информация на этой странице свойств выглядела многообещающе (она отображает такие параметры, как «копировать локальные», «копировать зависимости» и т. Д., А также свойства, такие как «assemblyIdentity»), но Visual Studio не копирует библиотеки DLL и не добавляет зависимости в файл манифеста автоматически.

Обратите внимание, что «зарегистрированный вариант» работает нормально.

У кого-нибудь есть идеи, что я делаю не так?

Обновление:

  • Когда я создаю простую C ++ DLL и встраиваю манифест с тем же именем и версией моей .NET COM DLL (та же самая AssemblyIdentity), мое приложение запускается нормально. Таким образом, проблема заключается в файле манифеста моей .NET COM DLL.
  • Я могу успешно извлечь манифест из DLL с помощью mt -managedassemblyname:..., а затем встроить тот же манифест с mt -outputresource:..., но это также не позволяет Windows успешно разрешить зависимость.

Ответы [ 2 ]

4 голосов
/ 20 января 2010

Я нашел шаги, необходимые для того, чтобы без регистрации .NET COM-взаимодействие работало самостоятельно: -)

  • Выполнить: mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
  • Очистить манифест (см. Формат на http://msdn.microsoft.com/en-us/library/eew13bza.aspx). В основном мне нужно было удалить все теги, кроме assemblyIdentity, clrClass и файла (и, в частности, удалить теги времени выполнения, mvid и зависимости).
  • Выполнить mt -outputresource:"myDll.dll" -manifest "myDll.manifest". По сути, это добавляет измененный манифест в видеРесурс для DLL. Обратите внимание, что это, очевидно, не тот же манифест (местоположение)! Если я реэкстрагирую манифест с параметром managedassemblyname, я все равно получаю «старый» манифест. Если я извлекаю его с параметром inputresource, я получаю новый.

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

0 голосов
/ 19 января 2010

Когда я сделал это, я начал с очень простого, базового компонента для сортировки COM. Также я использовал скрипт клиента в начальной разработке.

Я не использовал Visual Studio, а вместо этого текстовый редактор для кода .NET. Я вставил GUID для сборки и для интерфейсов и отметил интерфейсы для AutoDispatch.

using System;
using Interop=System.Runtime.InteropServices;

namespace Whatever
{
    [Interop.Guid("xxxxxxxx-9120-4283-b972-changethis05")]
    [Interop.ComVisible(true)]
    [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
    public partial class MyClass :
    ...
}

Я убедился, что у моего класса есть конструктор по умолчанию (без аргументов).

Я запустил regasm /codebase вручную, из командной строки, указав сборку .NET.

Я вручную написал javascript для создания экземпляра объекта.

Когда все было не так, я проверял ProgId с помощью OleView.exe.

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


Вы также можете использовать подход с другого направления; от клиента. Сборки .NET, такие как System.Random, помечаются для взаимодействия COM при установке .NET, поэтому вы можете использовать их для проверки правильности вашего подхода в C ++. Создание System.Random ProgId - это что-то вроде «привет, мир» C ++ - to-.NET-via-COM. Если это удастся, то вы знаете, что основной подход в C ++ - это звук.

...