我的最终目标是用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相关的内容。
1条答案
按热度按时间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位版本。请使用正确的版本。
其他重要提示:
请注意,“任何CPU”都不起作用。如果您想同时支持Office的32位和64位示例,您需要构建dll的两个变体并注册两者。
这是我用于测试的示例类:
请注意,您不能使用这些GUID,而必须使用自己的GUID。请使用Visual Studio中的“工具〉创建GUID”命令。
下面是我在激活引用后如何从VBA中使用该类: