Как сделать C # COM DLL эквивалентной ATL COM C ++ - PullRequest
2 голосов
/ 30 июня 2011

Здравствуйте, я пытаюсь разработать COM с использованием C # и Visual Studio 2005

Сначала я сделал интерфейс "CSharpServer.cs"

<code>
    using System;
    using System.Runtime.InteropServices;
    namespace CSharpServer
    {
       [ComVisible(true)]
       [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]
       public interface IManagedInterface
       {
          int PrintHi();
       }

       [ComVisible(true)]
       [Guid("C6659361-1625-4746-931C-36014B146679")]
       public class InterfaceImplementation : IManagedInterface
       {
          public int PrintHi()
          {
             Console.WriteLine("Hello!");
             return 33;
          }
       }
    }
</code>

Я скомпилировал.Вывод: csharp_server.dll.После этого я сделал: regasm csharp_server.dll / tlb / codebase
Вывод:

... RegAsm: предупреждение RA0000: Регистрация неподписанной сборки с / codebase может использовать вашу сборку длямешать другим приложениям, которые могут быть установлены на том же компьютере.Ключ / codebase предназначен для использования только с подписанными сборками.Пожалуйста, дайте вашей сборке строгое имя и перерегистрируйте ее.Типы зарегистрированы успешно ...

1ª Вопрос: Я должен подписать?Как?

2ª Вопрос: Удалено автором.

3ª Вопрос: Я могу запустить командную строку «regasm» только в Visual Studio.Вскоре, если я разработаю COM-компонент с использованием C # и раздам ​​его клиенту, на нем также должна быть установлена ​​Visual Studio?Если клиент только что установил Delphi и хочет использовать компонент, ему придется установить Visual Studio?

4ª Внутри Visual Studio C # я пытаюсь добавить ссылку на COM, но сообщается:

Ссылка на 'csharp_server' не может быть добавлена.Библиотека типов ActiveX 'xxx \ csharp_server.tlb' была экспортирована из сборки .NET и не может быть добавлена ​​в качестве ссылки.Вместо этого добавьте ссылку на сборку .NET.Но в ".NET ссылка".Я не вижу компонента "csharp_server".

Что я делаю не так или забыл?

Заранее спасибо.

1 Ответ

4 голосов
/ 30 июня 2011

# 1 Читайте на sn.exe. Создайте файл ключа строгого имени, затем щелкните правой кнопкой мыши свой проект в обозревателе решений и измените его свойства. Выберите вкладку «Подписание» и добавьте файл ключа. Если в вашей корпорации есть файл ключа, вы можете отложить подпись сборки и затем передать ее хранителю закрытого ключа (у вас не будет доступа к нему, потому что он крайне заблокирован, потому что если он открытый, любой может подписать его). приложение олицетворяет вашу компанию.) Не забудьте открыть папку «Свойства» в обозревателе решений и отредактировать имя / версию / и т. д. вашей сборки.

# 2 Вы говорите, что можете использовать DLL после удаления? В это трудно поверить.

# 3 В пакетах установщика, таких как Installshield, предусмотрена возможность регистрации сборок .NET по мере необходимости. В качестве альтернативы вы можете использовать regasm / regfile для создания .reg, который можно объединить с целевым реестром. Я действительно рекомендую: 1) использовать коммерческий инструмент для сборки вашего установщика или 2) быть ярким богом технологии MSI. Очень сложно написать правильный установщик с помощью инструментов SDK и даже с Wix.

# 4, насколько я знаю, не имеет обходного пути. Я думаю, что Microsoft решила, что было бы неправильно иметь доступ к управляемой сборке к другой управляемой сборке через сборку управляемой оболочки поверх оболочки COM-интерфейса, реализованной 2-й управляемой сборкой. Возможно, они не хотели, чтобы это стало обычным способом обойти правила привязки частной / глобальной сборки.

В любом случае, возможно, вы могли бы отредактировать библиотеку типов так, чтобы она «дурачила» управляемый генератор оболочек (TlbImp.exe), думая, что это собственная библиотека типов COM, но стоит ли это того? Большинство коммерческих приложений с общедоступным API имеют инструкции по использованию API приложения от COM и от управляемых клиентов, причем одно или другое является оболочкой, в зависимости от реализации Приложения. Эта техника работает для многих поставщиков без проблем в течение многих лет.

...