安装一个.NET COM+ dll

5

我需要重写我们其中一台服务器上安装的以下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对象看起来像这样:
编辑
在运行regasm命令后,我应该能够在组件服务中看到COM对象吗?
regasm C:\...\SSDSCommunicator.dll /CodeBase

你提到了Regasm,但是你是否像这样使用它:"regasm.exe /codebase youlib.dll"?(codebase参数很重要) - Stefan Egli
你是否为你的程序集设置了 [assembly: ComVisible(true)] 的属性? - user957902
@StefanEgli 我做了。然后就会产生一个TLB文件。接下来的步骤我不太确定——当我使用这段代码创建vbscript文件set obj = createObject("SSDSCommunicator.EmailClass")时,我遇到了一个ActiveX组件无法创建对象800A01AD错误。我也无法像上面的截图中看到该对象。 - woggles
你使用的是32位还是64位操作系统? - user957902
@GTG 谢谢 - 这将仅在安装它的(网络)服务器上使用,因此不需要代理。 - woggles
显示剩余4条评论
2个回答

1
在64位系统上有两个COM域。一个是32位COM对象,另一个是64位COM对象。如果您的.Net程序集是ANY_CPU,则默认情况下它会在64位系统上作为64位进程启动。如果您的COM对象仅注册为32位,则64位进程无法看到它。反之亦然,如果COM对象仅注册为64位,则32位进程无法看到它。

1

好的,非常棒...感谢user957902和GTG找到了答案(如果你想要分数,请在下面写一些答案):

  • 构建方案以x86为目标
  • 使用.snk文件签名程序集
  • 继承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)
 {...
}

        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接