C#学习教程:VB6中的.NET对象不使用regasm.exe?分享


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正常工作的问题没有结束

上述就是C#学习教程:VB6中的.NET对象不使用regasm.exe?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1301231.html

(0)
上一篇 2023年1月11日 下午6:14
下一篇 2023年1月11日 下午6:18

精彩推荐