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

原文地址: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;

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 类创建一个新的对象,然后调用其方法。

如果我们调试并单步调试并监视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 注:本文在翻译过程中,图片会与原文章有些差异,主要是我为了更好的让大家看清楚做了一个图文诠释。原文地址:http://www.geeksengine.com/article/create-dll.html 感谢原作者的文章。我正在更新我在访问VBA创建和跨越,我需要一些封装的功能在DLL中的场景来了一个应用程序。我以前用VB(Visual Basic中5和6)多年前创建的DLL。最
本文讲的是在VBA使用DLL改善宏的攻击功能, 最近对在VBA使用DLL的大量研究主要集在如何将shellcode注入到当前运行的进程这一部分,本文就是基于这些研究,向大家展示在VBA使用DLL改善宏的攻击功能。 大致的改善过程分以下2个阶段: 1.使用已经存在于磁盘上的DLL,执行regsvr32命令, 2.使用已经存在于磁盘上的DLL, 模...
原文地址:http://www.geeksengine.com/article/reference-dll.html感谢原作者的文章。 如果需要使用在C#或VB.Net创建一个DLLAccess VBA时,Excel VBA,或用于生产的机器上VB6应用程序,本文向您介绍如何注册,参考,并调用VBA或VB编辑器DLL。 你已经正确安装并注册组件? 首先,你需要获取的C#/VB
' Prompt user for database location strFile = InputBox("Enter the database file location", "Database Location") ' Set connection string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile ' Create connection Set cn = New ADODB.Connection cn.Open strCon ' Create recordset Set rs = New ADODB.Recordset ' Set SQL string strSQL = "SELECT * FROM [Sheet1$]" ' Open recordset rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic ' Loop through each record Do While Not rs.EOF ' Add data to table CurrentDb.Execute "INSERT INTO Table1 (Field1, Field2) VALUES ('" & rs!Field1 & "', '" & rs!Field2 & "')" ' Move to next record rs.MoveNext ' Close recordset and connection rs.Close cn.Close End Sub 4. 现在,您只需运行此代码即可从 Excel 将数据导入 Access。 注意:在上述代码,您可能需要更改表名,以及要导入的字段和列的名称。