不能创建c# COM DLL.是代码吗?项目属性?安装程序属性呢?32位64位?什么

本文关键字:属性 程序 安装 32位 什么 64位 项目 不能 COM DLL 代码 | 更新日期: 2023-09-27 18:10:42

目标:创建一个名为TestDLL.dll的c#程序集,该程序集可以安装到任何计算机上,以便MS Access VBA可以通过COM使用它。

环境:Windows 7 64位。
MS Office Professional Plus 2010版本:14.0.1753.5000(64位)。
Visual Studio 2010 Professional.

TestDLL.dll汇编代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TestDLL
{
    [ComVisible(true)]
    [Guid("7CAAEF3F-F867-445B-B078-5837A833620A")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IGreeting
    {
        string SayHello();
    }
    [ComVisible(true)]
    [ProgId("TestDLL.Greeting")]
    [Guid("73D4187A-F71D-4E45-832A-6DD9F88CC59B")]
    [ClassInterface(ClassInterfaceType.None)]
    public class Greeting : IGreeting
    {
        [ComVisible(true)]
        public string SayHello()
        {
            return "Hello, World!";
        }
    }
}

添加到解决方案中的WinForms项目成功调用SayHello()方法。

TestDLL项目属性:
应用程序/目标框架- .NET Framework 4
应用程序/程序集信息/使程序集com可见:false(我只希望程序集中的某些公共类是com可见的,而不是所有公共类。尽管在这个演示中只有一个类而且我希望它是com可见的。上面的代码应该已经解决了这个问题。)
应用程序/装配信息/标题和描述以及公司和产品均为"TestDLL"。
Build/Platform: Active(任意CPU)
构建/平台目标:x86
构建/注册COM互操作:false(我不希望它只在我的计算机上工作,而是所有计算机。因此,我想在安装时注册程序集,而不是在构建时。
签名/为程序集签名:false(我希望程序集驻留在安装文件夹中,而不是在GAC中。)

查看AssemblyInfo.cs:

[assembly: ComVisible(false)]
[assembly: Guid("6bf701f9-3953-43bb-a8af-1bdf7818af3c")]

组装完成。然后使用Visual Studio命令提示符(以管理员身份运行)使用以下命令创建类型库:

tlbexp "C:'(path)'bin'Release'TestDLL.dll" /win32 /out:"C:'(path)'bin'Release'TestDLL.tlb"

一个名为SetupTestDLL的Visual Studio Installer项目被添加到解决方案中。
在"文件系统"选项卡的"应用程序文件夹"中添加了TestDLL.dll。这也会自动添加TestDLL.tlb。
在该应用程序文件夹中右键单击TestDLL.dll可以打开一个属性窗口。这里,Register: vsdraCOM
右键单击TestDLL时。

寄存器:vsdrfCOM
(我猜vsdrcom意味着注册程序集,vsdrfCOM意味着为COM注册一个文件。)
Application文件夹中又添加了一个文件:TestDLL.pdb.

建立了SetupTestDLL。浏览到其输出文件夹,显示setup.exe和setupTestDLL.msi。右键单击setup.exe并以管理员身份运行。一个对话框显示正确的安装路径和正确的"install for everyone"选项。 安装成功。

在控制面板/程序和功能中,TestDLL现在被列出。它的出版商被列为"XYZ"。这是怎么来的?显然,从SetupTestDLL项目的属性窗口的"制造商"属性。我只在整个解决方案中创建了这个值。

在C:'Program Files (x86)中现在有一个"XYZ"文件夹,其下是一个TestDLL文件夹,其中包含三个文件。

启动MS Access。打开现有数据库及其现有代码模块。从"访问代码"窗口工具栏中选择"工具/参考"。TestDLL在"可用引用"列表框中找到。单击对应的复选框并单击OK。

单击代码窗口工具栏上的"对象浏览器"按钮。在下拉列表中选择。将其更改为TestDLL。类"Greeting"与其方法"SayHello"一起显示。到目前为止,一切顺利。
关闭对象浏览器。
在代码模块中创建此过程并尝试运行它。

Public Sub Test2()
    '    Dim o As New TestDLL.Greeting 
    ' The above is early binding. It should also work 
    ' since we set a reference.
    Dim o As Variant
    Set o = CreateObject("TestDLL.Greeting")
    ' The above is late binding.
    Debug.Print o.SayHello()
    Set o = Nothing
End Sub

结果:不管是早的还是晚的,ActiveX组件无法创建对象。

怎么了?

不能创建c# COM DLL.是代码吗?项目属性?安装程序属性呢?32位64位?什么

我只是想添加一个评论,但我没有足够的声望点,所以我只是把它作为一个答案,如果有必要的话删除它。

我不熟悉Visual Studio Installer项目,所以我不确定它是否正确注册程序集。您是否尝试使用regasm注册TestDLL?比如:

regasm /codebase TestDLL.dll /tlb:TestDLL.tlb

64位MS Office不能使用32位COM DLL的早期绑定,但是通过涉及dllproxy的reg hack,它可以使用它的后期绑定。我成功了