【问题标题】:Installing a .NET COM+ dll安装 .NET COM+ dll
【发布时间】:2011-12-29 12:12:57
【问题描述】:

我在我们的一台服务器上安装了以下 COM 对象,我需要重写...一些遗留代码使用该对象如下:

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

我已按照this 答案中的示例进行操作,但我正在努力注册 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参数很重要)
  • 您是否为您的程序集设置了程序集属性 [程序集:ComVisible(true)]?
  • @StefanEgli 我做到了。然后生成一个 TLB 文件。我不太确定接下来的步骤 - 当我使用此代码 set obj = createObject("SSDSCommunicator.EmailClass") 创建一个 vbscript 文件时,我得到一个 ActiveX 组件无法创建对象 800A01AD 错误。我也无法在组件资源管理器中看到对象,就像我上面的屏幕截图一样
  • 您使用的是 32 位还是 64 位操作系统?
  • @user957902 64bit windows 7 - 最终安装将在 64bit server 2008 上

标签: c# asp.net dll com


【解决方案1】:

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

  • 构建面向 x86 的解决方案
  • 使用 .snk 文件对程序集进行签名
  • 继承的服务组件
  • 在组件服务中手动添加了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)
 {...
}

        }
    }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2011-07-27
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多