VB6中的.NET对象不使用regasm.exe?

我正在为学校建立软件的软件公司,所以我们的客户端机器通常被锁定,这使我们很难在其上安装任何东西。

我们的旧系统主要基于(非常大的)MS Access项目,因此只需从本地文件夹运行即可解决访问问题。

我已经被赋予了将一些系统重新开发到c#.NET的任务 – 但是在过渡阶段能够让访问项目解开.NET事件会很好。

我今天玩了几个小时的com interops但是afaik使这些工作的唯一方法是用RegAsm.exe注册它们 – 不幸的是,这不是客户端环境中的一个选项。

我尝试过GetObject / CreateObject,但在引用dll或tlb文件时都不起作用,还有其他方法可以实现吗?

理想的解决方案是将com interop dll放在与Access项目相同的目录中。

是的,在有人说之前,我知道MS Access是邪恶的,只适合非常小的项目 – 但我只是在4个月前来到这里…

马龙

您可以在Access中托管CLR:

添加对mscoree的引用(可能是C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscoree.tlb)

Sub Main() Dim CORHost As New mscoree.CorRuntimeHost Dim Domain As Object Dim AssemblyFilename As String Dim Classname As String Dim Result As Object AssemblyFilename = "mscorlib" Classname = "System.Collections.ArrayList" CORHost.Start CORHost.CurrentDomain Domain Set Result = Domain.CreateInstance(AssemblyFilename, Classname).Unwrap() Result.Add "test" MsgBox Result.Count End Sub 

这绕过了使用注册表的需要。 这样做的缺点是你必须使用后期绑定对象。

您还可以添加对mscorlib.tlb的引用,以获取AppDomain类和其他类的类型信息。

只要您的客户端系统是Windows XP或更高版本,您就可以选择使用免注册COM 。 这取代了使用带有XML配置清单文件的系统注册表中的regasm(或本机COM服务器的regsvr32)注册COM组件的需要。

有了这个,您仍然使用标准的CreateObject调用来创建对象。

如果使用清单从我的VB6项目中使用.Net DLL。 唯一的要求是VB6可执行文件和.Net DLL在同一个文件夹中。

我正在使用UMMM工具在应用程序清单中自动创建依赖项。

您可以使用ActCtx.Manifest属性动态加载适当的清单,以便免费访问.Net interop coclasses。

你说你不能安装任何东西,但你可以自己将必要的东西写入注册表吗? 我认为所有的regasm都会将所有内容写入注册表,因此如果不存在,您可以在启动时从VB代码中有效地执行此操作,然后您可以加载互操作程序集。

您可以使用像进程监视器这样的工具来查看运行regasm时写入注册表的内容。

我确保你使用-codebase开关,并为com包装器的接口和类显式定义Guids。 没有这样做导致我试图让com包裹.net dlls正常工作的问题没有结束