Установка .NET COM + dll - PullRequest
       7

Установка .NET COM + dll

5 голосов
/ 15 ноября 2011

У меня на одном из наших серверов установлен следующий COM-объект, который мне нужно переписать ... в некоторых устаревших кодах этот объект используется следующим образом:

Set oEmail = CreateObject("SSDSCommunicator.EmailClass")
oEmail.Send(szFrom, szRecipients, szSubject, szEmailBody, SMTPServer, szErr, "", , , , True)

Я следовал примеру в этом ответе, но я пытаюсь зарегистрировать компонент COM.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mail;
using System.Runtime.InteropServices;


namespace SSDSCommunicator
{

    [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("DB38A91C-9EB6-4472-9A49-40722431E096")]
    public interface IEmailClass
    {
        void launch();
        bool Send(string szFrom, string szTo, string szSubject, string szMessage, string szSMTPServer, ref object szError, string szAttachments = "", string szReplyTo = "", string szCC = "", string szBCC = "", bool bHTMLBody = false);
    }

    [ClassInterface(ClassInterfaceType.None), Guid("A00C16DA-1791-4A3A-8D16-4765A9FAD060"), ProgId("SSDSCommunicator.EmailClass")]
    public class EmailClass : IEmailClass
    {
        private string path = null;

        public void launch()
        {
            Console.WriteLine("I launch scripts for a living.");

        }

        public bool Send(string szFrom, string szTo, string szSubject, string szMessage, string szSMTPServer, ref object szError, string szAttachments = "", string szReplyTo = "", string szCC = "", string szBCC = "",    bool bHTMLBody = false)
        {
    ...
        }

    }
}

Проект строится успешно. Как мне зарегистрировать dll как COM-объект, чтобы старый код VB6 работал?

Я поставил галочку в регистре COM-взаимодействия и Сделал сборку COM видимой в настройках проекта.

Мне не повезло с regsvr32 (точка входа не найдена) или с regasm ...

COM-объект выглядит так на старом сервере:

enter image description here

Редактировать

Можно ли увидеть COM-объект в службах компонентов после выполнения команды regasm?

regasm C:\...\SSDSCommunicator.dll /CodeBase

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

В 64-битной системе есть два COM-домена. Один для 32-битных COM-объектов, а другой - для 64-битных COM-объектов. Если ваши .Net сборки имеют ANY_CPU, то по умолчанию он собирается запускаться как 64-битный процесс в 64-битной системе. Если ваш COM-объект является только 32-битным, то 64-битный процесс не сможет его увидеть. Обратное также верно, если COM-объект повторно обрабатывается только как 64-битный, тогда 32-битный процесс не может его увидеть.

1 голос
/ 16 ноября 2011

ОК, сладкий ... нашел ответ на этот вопрос благодаря user957902 и GTG (напишите несколько ответов ниже, если хотите набрать очки):

  • Построил решение, ориентированное на x86
  • Подписаносборка с использованием файла .snk
  • Inherited ServicedComponent
  • Вручную добавили компонент SSDSCommunicator в службы компонентов, а затем добавили dll в качестве компонента

Окончательный код ниже:

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web.Mail;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;


    namespace SSDSCommunicator
    {

        [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("DB38A91C-9EB6-4472-9A49-40722431E096")]
        public interface IEmailClass
        {           
            bool Send(string szFrom, string szTo, string szSubject, string szMessage, string szSMTPServer, ref object szError, string szAttachments = "", string szReplyTo = "", string szCC = "", string szBCC = "", bool bHTMLBody = false);
        }

        [ClassInterface(ClassInterfaceType.None), Guid("A00C16DA-1791-4A3A-8D16-4765A9FAD060"), ProgId("SSDSCommunicator.EmailClass")]
        public class EmailClass : ServicedComponent, IEmailClass
        {
            private string path = null;           

            public bool Send(string szFrom, string szTo, string szSubject, string szMessage, string szSMTPServer, ref object szError, string szAttachments = "", string szReplyTo = "", string szCC = "", string szBCC = "",    bool bHTMLBody = false)
 {...
}

        }
    }
...