要添加到已经存在的答案:
与
.NET 4.0
,它实际上是很简单的消耗你的VBA项目中的C#DLL没有注册COM。
编辑:我刚刚与mscorlib.tlb
和mscoree.tlb
是在C:\windows\Microsoft.NET\Framework\v2.0.50727
尝试这一点 - 在加载编译3.5--组件和它的工作就好了。所以显然你不需要.NET 4.0。
以下是如何在VBA项目中使用C#dll的示例。它从this答案稍作修改。
1)添加对以下类型库的VBA项目(工具 - >参考):
C:\windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb
C:\windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb
(使用Framework64文件夹,如果你正在运行64位Office)
2) C#项目,请确保您的[ComVisible(true)]
属性添加到您的类:
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace VB6FuncLib
{
[ComVisible(true)]
public class VB6FuncLib
{
public VB6FuncLib()
{ }
public void test()
{
MessageBox.Show("Test Successful");
}
}
}
你不需要CHEC k选项“注册COM Interop”。这仅用于构建标准的COM对象。您不必检查“Make Assembly COM Visible”,除非您希望整个组件可见(这也将消除对属性COMVisible
的需求)。
3)在你的VBA代码,添加一个新的模块,使用此代码:
Sub Test()
Dim Host As mscoree.CorRuntimeHost
Set Host = New CorRuntimeHost
Host.Start
Dim Unk As IUnknown
Host.GetDefaultDomain Unk
Dim AppDomain As AppDomain
Set AppDomain = Unk
Dim ObjHandle As ObjectHandle
Set FS = CreateObject("Scripting.FileSystemObject")
Path = FS.GetParentFolderName(CurrentDb().Name)
Set ObjHandle = AppDomain.CreateInstanceFrom(Path & "\VB6 Function Library.dll", "VB6FuncLib.VB6FuncLib")
Dim ObjInstance As Object
Set ObjInstance = ObjHandle.Unwrap
ObjInstance.test
Host.Stop
End Sub
4)DLL复制到同一文件夹中Office项目和运行测试在VBA()子。
注:
应当指出的是,这种技术的局限性之一是,如果.DLL被存储在远程网络共享将无法正常工作。一个简单的解决方案是将其复制到每个使用该PC的本地文件夹中。另一种解决方案是将二进制文件包含在Access应用程序/ VBA项目中,并让MS-Access导出它们。一种可以实现的方法是将它们存储在Base64中的表格或电子表格中,然后转换它们并将它们导出为二进制文件。
我能够通过创建一个类型库去使用DLL(使用tlbexp)并在我的VBA项目中添加对TLB的引用,从而获得早期绑定(以及Microsoft IntelliSense)有点复杂,因为它需要你的VBA应用程序知道DLL和TLB文件的位置(并且还需要有人确认它们在那里)。
我看着使用该API。但具有讽刺意味的是,微软创建了一个包来避免需要注册的注册,并留下了我之前的相同问题 - 如何在我的客户机上获取?尽管Microsoft.Windows.Actctx可用于Windows 2K3 +,但它仅包含在服务器安装中。还有另一个SO问题在这里抱怨:http://stackoverflow.com/questions/979567/microsoft-windows-actctx-on-windows-xp。 MSDN支持它:http://msdn.microsoft.com/en-us/library/aa375644(VS.85).aspx。 – Jelly 2010-01-15 14:15:39
从我所知道的Activation Context API是Kernel32的一部分。lib,这意味着你不必安装任何东西,并且它包含在任何支持WinXP SP2和更高版本的SxS的操作系统中。 我在WinXP SP3上完成了自己的工作,并且没有特别的安装。 我不知道Microsoft.Windows.Actctx,但我100%确定你可以通过从Kernel32.lib导入相关函数直接调用API来直接调用API。就像这个示例代码一样http://www.mazecomputer.com/sxs/help/sxsapi3.htm – 2010-01-16 20:35:50
哦,我明白了。我在网上看到的所有在VBA中使用Actctx对象的例子都是使用Actctx对象,而不是API,这是我最初得出结论认为它不能用代码完成的唯一原因。显然,它是两种方式(并称为同一件事)只是为了让我困惑。我应该不会有太多的麻烦让它启动并运行 - 它应该是一个比黑客攻击更稳定的解决方案 - 所以当我到达那里时我会移动接受的解决方案标志。谢谢您的帮助! – Jelly 2010-01-19 16:52:41