从Access 2003调用托管代码

时间:2009-02-10 15:54:40

标签: c# .net ms-access ms-office

我已经在access-programmers.co.uk

上发帖了

请在该论坛上发布回复..

我在c#3.5中编译了一个dll。我在其中设置了解决方案属性来注册COM互操作的构建。

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

namespace SBG_TestWithVBA
{
  [ClassInterface(ClassInterfaceType.AutoDual)]

  public class TestHello
  {
    [ComVisible(true)]

    public string SayHello(string name)
    {
      string message = "Hello " + name;
      return message;
    }
    public string HelloWorld()
    {
      string message = "Hello World!";
      return message;
    }
  }
}

然后我使用

注册了程序集和tlb文件
  

“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ regasm.exe”“\ sbgfs01 \ users \ Vincent Pirolli \ My Docs \ Visual Studio 2008 \ Projects \ TestWithVBA \ TestWithVBA \ bin \ Release \ SBG_TestWithVBA .dll“/ tlb:”\ sbgfs01 \ users \ Vincent Pirolli \ My Docs \ Visual Studio 2008 \ Projects \ TestWithVBA \ TestWithVBA \ bin \ Release \ SBG_TestWithVBA.tlb“

然后我从工具>参考菜单中添加了vb中的tlb文件..

我的VBA代码如下:

Sub test()
    Dim f As SBG_TestWithVBA
    Set f = New SBG_TestWithVBA
    f.HelloWorld
End Sub

即使Intellisense在VBA编辑器中工作,我也会收到以下错误: “自动化错误 系统找不到指定的文件。“

有人有任何想法吗?我在之前的帖子中有文章,但我找不到解决方案。


好吧,现在这真让我烦恼..

我设法让这个工作..但我不明白为什么..

在visual studio中的解决方案属性中...在Build选项卡上我将'Register for COM interop'设置为true,并在'Application> Assembly Information'中设置'Make assembly COM-Visible'= TRUE ..

我将VS项目文件放在共享驱动器中。现在,如果我将构建位置设置为共享驱动器上的bin文件夹,在我的项目文件下,当我从VBA调用时它不起作用..但是,如果我将构建文件夹设置为本地C驱动器上的文件夹,那么它从VBA调用时工作正常..

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

看起来您正在注册的程序集位于网络共享上。在这种情况下,.net程序集会应用不同的安全模型。

您是否尝试将程序集和TLB放在本地目录中,然后在工具>中添加TLB。参考菜单?

另外 - 这可能完全没有了 - 但是有没有必要在RegSvr32上注册DLL,这样它可以寻址?

答案 1 :(得分:0)

事实上,你可以让它在本地工作,但它在网络共享上失败,指向.NET安全问题。 .NET将本地资源与网络资源区别对待,不同于受信任的Internet和不受信任的Internet。我怀疑您的.NET组件配置为信任本地程序集,但不信任LocalIntranet程序集。

请参阅此处了解使本地Intranet等工作的配置要求:

http://support.microsoft.com/kb/892465

有关确定程序集尝试运行的区域的方法,请参阅此答案:

https://stackoverflow.com/questions/239463?sort=newest

顺便说一下,我会说我发现配置环境以定位网络共享是相当复杂的,因为在本地计算机上使用代码时所做的许多假设都是无效的。出于这个原因,我更愿意尽可能安装到本地计算机,并且只有在有充分理由不在本地安装时才与安全模型作斗争。

答案 2 :(得分:0)

如果您想了解有关.net安全性的更多信息,请访问Google for CASPOL.EXE。 CASPOL.EXE是一个随所有.net框架一起提供的安全工具。 CASPOL代表Code Acces Security POLicy。使用此工具,您可以根据区域配置策略。