Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

时间:2022-08-30 17:42:24

注:本文在翻译过程中,图片会与原文章有些差异,主要是我为了更好的让大家看清楚做了一个图文诠释。

原文地址:http://www.geeksengine.com/article/create-dll.html 感谢原作者的文章。

我正在更新我在访问VBA创建和跨越,我需要一些封装的功能在DLL中的场景来了一个应用程序。我以前用VB(Visual Basic中5和6)多年前创建的DLL。最好的办法是使用C#或VB.Net创建DLL来实现。

创建在C#或VB.Net一个DLL并不难,只要你有面向对象编程经验或知识。创建DLL后,我试图从Access VBA编辑引用它,但一直得到消息“无法添加到指定文件的引用。”在这个问题上经过一番研究,我了解需要以下操作:

(1)如何正确地创建Access或Excel中的DLL(或在任何Microsoft Office应用程序或VB6中使用)http://blog.csdn.net/kongwei521/article/details/77921436

(2)如何正确地将C#或VB.Net的DLL在开发机器或者生成环境机器中注册 http://blog.csdn.net/kongwei521/article/details/77929273

(3)如何正确地在Access VBA或Excel VBA内引用访问C#或VB.Net写的DLL http://blog.csdn.net/kongwei521/article/details/77929277

在本文中,我将向你展示如何正确地在Visual Studio中创建一个C#或VB.Net DLL和使用它的MS Access,Excel的VBA或VB6应用程序内。希望提示可以为您节省几个小时或头痛的日子。

1. 必须以管理员身份运行 Visual Studio(你需要管理员权限来让 Visual Studio 正确注册 DLL。您可以使用 regasm 命令去注册,不过如果使用 Visual Studio 会容易些)。创建一个新的C#(或VB.Net)项目,然后选择类库作为项目 ,命名为:SimpleCalc

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

下面我创建了一个简单的计算类测试。这个类有两个可变构件以及一个Add()方法。该方法将两个整数计算并返回结果。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleCalc
{
public class Calc
{
private int numberOne = 0;
private int numberTwo = 0;

public void SetNumberOne(int number)
{
numberOne = number;
}

public void SetNumberTwo(int number)
{
numberTwo = number;
}

// Add two integers
public int Add()
{
return numberOne + numberTwo;
}
}
}



2:配置项目属性,使其COM可见。鼠标右键点击项目SimpleCalc的属性打开项目属性的对话窗口。

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

当打开项目属性窗口中后,点击应用程序选项卡,然后单击【程序集信息】按钮。

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL


【程序集信息】打开的窗口,选中使程序集COM可见(M)

在VB或VBA创建的应用程序是基于COM的应用程序。所以,你在C#或VB.Net创建的类库必须作为一个COM可见组件来创建。这使得基于COM的应用程序调用类库的成员变量和方法。

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL


3.注册为COM互操作。

除了使DLL的使程序集COM可见(M),我们还需要将此DLL在Windows中注册为COM组件。根据你的的情况下有几种方法可以做到这一点。

对于开发的电脑,我们可以在 Visual Studio 中勾选 "【为COM互操作注册(C)】" 选项。在项目属性窗口,单击生成选项卡。然后勾选【为COM互操作注册(C)】(根据您的Visual Studio版本,它可能是在一个不同的选项卡上)。这使得Visual Studio中自动执行两件事情,当项目完成编译。首先,它会生成一个.TLB类型库文件。其次,它将在 Windows 注册表中注册 COM 组件的类信息。

【为COM互操作注册(C)】属性指定应用程序是否会否将 com 对象公开给客户端应用程序, 以便它们可以透明地与 com 对象进行交互。

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

下面是在 Windows 注册表中显示已编译后的程序集注册内容, 以便 COM 客户端可以透明地使用. NET 类。请注意, DLL 的路径存储在CodeBase属性中。

下图需要打开 控制面板=组件服务=》com+组件

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

要注册其他计算机上,如生产环境中的电脑,您可以通过使用RegAsm.exe注册程序集。请参见另外一篇文章的详细信息。

4.编译该项目。

生成解决方案。然后进入bin文件夹。取决于您的勾选是否是调试或发布版本,你可以在Bin目录下找到的编译后的DLL和任何调试.TLB类型库文件。

在我们的例子中,它发布的路径是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

5.将生成类型库文件复制到Windows系统文件夹目录下。

Windows系统文件夹目录【C:\Windows\System32】是DLL和类型库的默认位置,让我们的类型库生成后的SimpleCalc.tlb复制到此目录下
Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

OK至此已经生成在VBA中要调研的tld了

6.从Access 、Excel、Word 等按Ctrl+F11进入VBA 编辑器进行引用生成的类库文件。

注:我这里是创建的excel文件进行测试的,原文中用的是access文件

首先,创建一个新的 Access 数据库,打开 Visual Basic 代码编辑器。在菜单中点工具-> 引用


Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

点击引用窗口时,单击浏览按钮。

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

然后点击浏览(B),打开 C:\Windows\System32文件夹目录后选择 SimpleCalc.tlb打开。


Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

点击打开完成后,SimpleCalc将会显示在你的参照引用列表中,你需要向下移动并在参照引用列表中找到并勾选中。然后单击确定关闭引用窗口。或者你可以选择进行上移

您可以在注册表中的截图记得上面有在Codebase项一个DLL路径值。VBA将使用此注册表信息来查找调用的DLL。在我们例子中,它是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \发布\ SimpleCalc.dll

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

7.在 VBA 代码中使用SimpleCalc生成的DLL。

若要使用 C# DLL 中的变量和方法,我们需要调用 VBA 里面的参照引用 DLL。将一个按钮添加到 Access 窗体,然后向其添加一个 click 事件。在 click 事件中我们调用在 VBA 模块中创建的 test()方法


下面是一个示例: 在VBA 调用 SimpleCalc.dll。test() 函数调用.Net DLL 通过从 Calc 类创建一个新的对象,然后调用其方法。


Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL


Private Sub CommandButton1_Click()
Call test
End Sub
Public Function test()
Dim lngResult As Long

Dim objCalc As SimpleCalc.Calc
Set objCalc = New SimpleCalc.Calc

objCalc.SetNumberOne (3)
objCalc.SetNumberTwo (6)

lngResult = objCalc.Add()

End Function

如果我们调试并单步调试并监视lngResult变量 ,我们将会看到,执行调用 C# DLL 内部计算后并把结果值9返回到 VBA变量中。你可以看到在即时监视窗口或鼠标移动到变量lngResult 上就会显示结果值。

Excel:

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

Access:

Access 、Excel、Word中的VBA引用C#或VB.Net创建的DLL

在这篇文章中,我们经历了创建.Net C# DLL,然后使用它 在VBA调用访问的步骤。它带来.Net 的力量到 Microsoft Office 应用程序。在这篇文章的局限性是 Visual Studio在我们的开发机器只自动注册了 DLL 和类型库。我们没有介绍如何将 DLL 部署到生成环境的电脑上。在这种情况下,查阅有关如何使用 Regasm.exe (程序集注册工具) 在目标机器上注册 DLL 请参另外一篇文章注意您也可以为您的应用程序创建安装程序包和 regasm.exe 作为自定义命令添加到安装程序包中。


您编码愉快 !

其他文章系列:

(1)如何正确地创建Access或Excel中的DLL(或在任何Microsoft Office应用程序或VB6中使用)http://blog.csdn.net/kongwei521/article/details/77921436

(2)如何正确地将C#或VB.Net的DLL在开发机器或者生成环境机器中注册 http://blog.csdn.net/kongwei521/article/details/77929273

(3)如何正确地在Access VBA或Excel VBA内引用访问C#或VB.Net写的DLL http://blog.csdn.net/kongwei521/article/details/77929277