请在该论坛上发布回复..
我在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调用时工作正常..
有什么想法吗?
答案 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。使用此工具,您可以根据区域配置策略。