.net 在Visual Studio 2022中实现C#类库COM可见

fbcarpbf  于 2023-01-03  发布在  .NET
关注(0)|答案(1)|浏览(518)

我的最终目标是用C#构建一个类库(Calculator.dll),其中包含Excel可以通过VBA访问的函数。
我曾希望避免注册dll的需要,而是在VBA代码中使用Declare Function语句,但显然这是不可能的,我的研究表明我需要使类库COM可见,然后注册它,并将其添加为VBA工程的引用。在早期的Visual Studio版本中,这似乎是在项目属性对话框中单击一个框的问题,但我在VS 2022?中没有看到该框!
以下是我对一个“玩具”示例采取的步骤,以及我遇到的问题。
(1)我用一个Calculate类和一个简单的Add两个整数的方法构建了下面的.dll。因为我们使用32位Excel,所以我将它配置为x86。

namespace ClassLibraryCalculator
{
    public class Calculate
    {
        public int Add(int a,int b){ return a + b; }
    }
}

(2)在命令提示符下,以管理员身份运行时,我尝试运行regsvr32“ClassLibraryCalculator.dll”,但遇到错误“..已加载,但未找到入口点DllRegisterServer”
通过搜索,可以认为解决这个问题的方法是修改项目属性,(在VS的早期版本中)是一个对话框x1c 0d1x
带有复选框,但在Visual Studio 2022项目属性中没有看到与COM相关的内容。

mrwjdhj3

mrwjdhj31#

首先,确保创建的项目类型为“类库(.NET Framework)”,并且使用经典的Windows .NET Framework(如版本4.8)。不要选择基于.NET标准并支持多个不同操作系统的“类库”项目类型。

创建项目后,在解决方案资源管理器中右键单击项目并选择“属性”,以打开项目属性。
在项目属性中,转到“应用程序”,然后单击“程序集信息”。

在“组件信息”对话框中,启用“使组件COM可见”复选框。

详情请参见Turn a simple C# DLL into a COM interop component
请注意,您可以使用项目属性的“Build”区域中的“Register for COM interop”设置来注册DLL(VS需要以管理员权限运行)。当尝试从命令行注册时,不要使用“regsvr32”,而要使用“regasm”。请注意,regasm有32位和64位版本。请使用正确的版本。
其他重要提示:

  • 如果将Office作为64位可执行文件运行,请在项目属性的“生成”区域中选择“Platform target = x64”。
  • 如果将Office作为32位可执行文件运行,请在项目属性的“生成”区域中选择“Platform target = x86”。

请注意,“任何CPU”都不起作用。如果您想同时支持Office的32位和64位示例,您需要构建dll的两个变体并注册两者。
这是我用于测试的示例类:

using System;
using System.Runtime.InteropServices;

namespace ClassLibrary4
{
    [Guid("ECB682F0-8AF1-40EA-B73A-1FACF3C7F742")]
    public interface IClass1
    {
        void Test();
    }

    [Guid("4EC93EC5-FA8C-4E82-8931-E47D979BDA93")]
    public class Class1 : IClass1
    {
        public void Test()
        {
            System.Console.Beep();
        }
    }
}

请注意,您不能使用这些GUID,而必须使用自己的GUID。请使用Visual Studio中的“工具〉创建GUID”命令。
下面是我在激活引用后如何从VBA中使用该类:

' Declare variable with interface type
Dim c As ClassLibrary4.IClass1
' Create from class type
Set c = New ClassLibrary4.Class1
' Use.
c.Test

相关问题