注:本文在翻译过程中,图片会与原文章有些差异,主要是我为了更好的让大家看清楚做了一个图文诠释。
原文地址: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
下面我创建了一个简单的计算类测试。这个类有两个可变构件以及一个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的属性打开项目属性的对话窗口。
在【程序集信息】打开的窗口,选中使程序集COM可见(M)。
在VB或VBA创建的应用程序是基于COM的应用程序。所以,你在C#或VB.Net创建的类库必须作为一个COM可见组件来创建。这使得基于COM的应用程序调用类库的成员变量和方法。
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 对象进行交互。
下面是在 Windows 注册表中显示已编译后的程序集注册内容, 以便 COM 客户端可以透明地使用. NET 类。请注意, DLL 的路径存储在CodeBase属性中。
下图需要打开 控制面板=组件服务=》com+组件
要注册其他计算机上,如生产环境中的电脑,您可以通过使用RegAsm.exe注册程序集。请参见另外一篇文章的详细信息。
4.编译该项目。
生成解决方案。然后进入bin文件夹。取决于您的勾选是否是调试或发布版本,你可以在Bin目录下找到的编译后的DLL和任何调试.TLB类型库文件。
在我们的例子中,它发布的路径是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \
5.将生成类型库文件复制到Windows系统文件夹目录下。
Windows系统文件夹目录【C:\Windows\System32】是DLL和类型库的默认位置,让我们的类型库生成后的SimpleCalc.tlb复制到此目录下OK至此已经生成在VBA中要调研的tld了
6.从Access 、Excel、Word 等按Ctrl+F11进入VBA 编辑器进行引用生成的类库文件。
注:我这里是创建的excel文件进行测试的,原文中用的是access文件
首先,创建一个新的 Access 数据库,打开 Visual Basic 代码编辑器。在菜单中点工具-> 引用
点击引用窗口时,单击浏览按钮。
然后点击浏览(B),打开 C:\Windows\System32文件夹目录后选择 SimpleCalc.tlb打开。
点击打开完成后,SimpleCalc将会显示在你的参照引用列表中,你需要向下移动并在参照引用列表中找到并勾选中。然后单击确定关闭引用窗口。或者你可以选择进行上移
您可以在注册表中的截图记得上面有在Codebase项一个DLL路径值。VBA将使用此注册表信息来查找调用的DLL。在我们例子中,它是D:\ CSHARP \ SimpleCalc \ SimpleCalc \ BIN \发布\ SimpleCalc.dll
7.在 VBA 代码中使用SimpleCalc生成的DLL。
若要使用 C# DLL 中的变量和方法,我们需要调用 VBA 里面的参照引用 DLL。将一个按钮添加到 Access 窗体,然后向其添加一个 click 事件。在 click 事件中我们调用在 VBA 模块中创建的 test()方法
下面是一个示例: 在VBA 调用 SimpleCalc.dll。test() 函数调用.Net DLL 通过从 Calc 类创建一个新的对象,然后调用其方法。
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:
在这篇文章中,我们经历了创建.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