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

时间:2010-03-04 10:41:47

标签: c# ms-access com vb6 interop

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

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

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

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

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

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

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

马龙

4 个答案:

答案 0 :(得分:6)

您可以在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类和其他类的信息。

答案 1 :(得分:4)

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

使用此方法,您仍然可以使用标准的CreateObject调用来创建对象。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

您可以使用process monitor之类的工具查看运行regasm时写入注册表的内容。

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