Создание библиотеки взаимодействия COM для ASP Classic с использованием инфраструктуры 4.0 и Visual Studio 2010 - PullRequest
6 голосов
/ 07 февраля 2011

Пройдя через несколько различных статей и не найдя ничего особенно убедительного, что шаг за шагом подводит меня к процессу, я пришел за помощью.

Сценарий

Мой клиент является опытным разработчиком только для ASP Classic .Недавно они приобрели учетную запись для сайта, изначально написанного на ASP.NET.Они превращают сайт во что-то, что они могут активно поддерживать, но сайт изначально включал в себя обработчик изображений, который брал динамически изменяющиеся данные об уровне воды и выводил изображение, содержащее графическое представление этих данных.Требуется разработать библиотеку взаимодействия COM , которую можно зарегистрировать на сервере и вызвать с помощью CreateObject, чтобы сгенерировать байтовый массив этого же изображения для вывода с использованием Response.BinaryWrite .Библиотека взаимодействия COM должна быть зарегистрирована на удаленном сайте на Windows 2000 Server, и я не могу предположить, что у них есть доступ к regasm / gacutil для выполнения этой задачи.

Сложность

Я построил библиотеку классов, создав проект Class Library в Visual Studio 2010, выбрав «COM Class» из шаблона и вставив код для создания класса сединственный открытый метод для возврата байтового массива, когда ему дано целое число (ну, ну, конечно, перечислитель).К сожалению, даже на моей собственной машине для разработки после сборки библиотеки и регистрации (regasm) и кэширования сборки (gacutil) я не могу выполнить вызов через Classic ASP для создания экземпляра объекта, получив вместо этого " ActiveX компонент не может создать объект "ошибка.И, конечно же, на сайте сервера файл DLL не может быть зарегистрирован, ответ: «Обязательный модуль не найден».

Используемые ресурсы

Я уже просмотрел следующие статьи и не нашел нужных мне ответов:

  1. (Основные шаги) Пошаговое руководство. Создание объектов COM сVisual Basic
  2. Сборка и развертывание сборки .NET COM
  3. .NET COM + Компонент взаимодействия с классическим интерфейсомASP

Что мне нужно

По сути, мне нужно немного держаться за что-то вроде пошагового действия.принять соответствующие требования и правильно создать модуль взаимодействия COM + в Visual Studio 2010. Создание самого объекта класса само по себе не очень сложно.

Тем не менее, ни одна из статей, которые я просмотрел, действительно не обсуждает параметры проекта или процедуры сборки с помощью Visual Studio 2010 или .NET 4.0 Framework, и ни одна из них не обсуждается, если есть особые соображения по развертываниюболее старые системы, такие как Windows Server 2000 и фактическая регистрация библиотеки в системе, например, с regsvr32 .

Ответы [ 2 ]

11 голосов
/ 08 февраля 2011

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

Создайте новую (стандартную версию) библиотеку классов .NET, используя C # или VB. Определите интерфейс COM (замените GUID на ваш собственный):

[ComVisible(true)]
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")]
public interface IComm
{
    string GetMyGroups();
}

Теперь определите класс, который реализует этот интерфейс (снова замените GUID на ваш собственный):

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")]
[ProgId("Test.Comm.1")]
public class Comm : IComm
{
    public string GetMyGroups()
    {
        var comm = new CommunicatorAPI.MessengerClass();

        var groups = comm.MyGroups as IMessengerGroups;
        return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray());
    }
}

Атрибут Prog ID в этом классе - это то, что вы будете использовать для создания экземпляра вашего компонента из ASP.

Строго назовите сборку (Свойства проекта -> вкладка «Подписывание» -> «Подписать сборку» -> Создать новый файл ключа строгого имени с помощью раскрывающегося списка)

Теперь, соберите сборку и зарегистрируйтесь, используя Regasm - если вы не хотите регистрироваться в GAC (что я бы порекомендовал, поскольку GACing не упрощает развертывание), обязательно используйте параметр -Codebase (он просто добавляет запись reg, которая сообщает клиентам, где найти сборку) - например:

regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll"

Теперь вы должны иметь возможность создавать экземпляр компонента и вызывать методы для него - например (в javascript):

var a = new ActiveXObject("Test.Comm.1");
alert(a.GetMyGroups());

Когда дело доходит до развертывания, важной работой, которую выполняют Regasm и Regsvr32, является запись различных настроек в реестр, чтобы клиенты могли найти компонент COM (на основе идентификатора программы или идентификатора класса COM). Все, что вам нужно сделать, это выяснить, какие настройки COM записываются при запуске Regasm на локальном компьютере, и записать их в реестр на сервере. Вы можете использовать ProcMon для отслеживания того, что записывается в реестр при запуске Regasm.

Вообще говоря, вы можете ожидать увидеть что-то подобное в реестре:

[HKEY_CLASSES_ROOT\Test.Comm.1]
@="ClassLibrary2.Comm"

[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID]
@="{00585504-90C8-4760-A359-67CAF08FFED1}"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}]
@="ClassLibrary2.Comm"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}]

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0]
"Class"="ClassLibrary2.Comm"
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a"
"RuntimeVersion"="v4.0.30319"
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId]
@="Test.Comm.1"

Надеюсь, это поможет:)

1 голос
/ 26 апреля 2016

У меня есть классический сайт ASP, который использует COM-объект VB6.Я хотел создать новую версию COM-объекта, используя .NET вместо VB6.Вот как я это сделал (надеюсь, это поможет).Я включаю инструкции для C # и VB.NET.

[01]

  • Запустите Visual Studio 2015 (запуск от имени администратора).
  • Создайте новый проект "Библиотека классов".
  • Назовите его: "DotNetCom"

[02] C #

  • Добавьте новый класс, назовите его «HelloCOM».
  • Используйте следующий код в качестве начального шаблона

(посетите https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx для получения дополнительной информации)

    using System.Runtime.InteropServices;

    namespace DotNetCom
    {
        [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
        public interface HelloCOMInterface
        {
            [DispId(1)]
            string Hello();
        }

        [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), 
            InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface HelloCOMEvents 
        {
        }

        [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
            ClassInterface(ClassInterfaceType.None),
            ComSourceInterfaces(typeof(HelloCOMEvents))]
        public class HelloCOM : HelloCOMInterface
        {
            public string Hello()
            {
                return "Hello there!";
            }
        }
    }

[02] VB.NET

  • Добавьте новый «COM-класс», назовите его «HelloCOM».
  • VB.NET создаетстартовый шаблон.
  • Добавьте следующую функцию в класс "HelloCOM".

    Public Function Hello() As String
        Return "Hello there!"
    End Function
    

[03] C #

  • Откройте свойства проекта.
  • Перейдите в «Приложение».
  • Нажмите «Информация о сборке ...».
  • Установите флажок «Сделать сборку COM»-Visible "
  • Перейти к" Build ".
  • Выбрать" Цель платформы: x86 ".
  • Проверить" Зарегистрировать COM для взаимодействия "

[03] VB.NET

  • Открыть «MyProject».
  • Перейти в «Компиляция».
  • Выбрать«Целевой процессор: x86».

[04]

  • Сборка «DotNetCom.dll».

[05]

  • Открыть командную строку (запуск от имени администратора).
  • Сменить каталог на dll.

    cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug
    
  • Запустить RegAsm /codebase.

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll"
    

[06]

  • Запустить службы компонентов.
  • Добавить новое приложение COM +.
  • Назовите его: "DotNetCom".
  • Откройте свойства "DotNetCom".
  • Перейдите в раздел "Безопасность"Вкладка ".
  • UNCHECK" Принудительно проверяет доступ для этого приложения ".

[07]

  • Добавить новый компонент.
  • Выберите «DotNetComTest.tlb» (НЕ выбирайте «DotNetComTest.dll»).

[08]

  • Использование COM-объекта со страницы Classic ASP.

    <%
    Dim HelloCOM
    Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM")
    Response.Write HelloCom.Hello
    %>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...