VB6中共享.NET对象而不使用regasm.exe?我在一家为学校构建软件的软件公司工作,所以我们的客户端机器通常被锁定,这让我们很难在上面安装任何东西。我们的旧系统主要基于(非常大的)MSAccess项目,因此只需从本地文件夹运行即可解决访问问题。我被赋予了将某些系统重新开发为c#.NET的任务——但在此期间,能够访问项目展开.NET事件会很好。我今天玩了几个小时的com互操作,但据我所知,使这些工作正常进行的唯一方法是使用RegAsm.exe注册它们——不幸的是,这在客户端环境中不是一个选项。我试过GetObject/CreateObject但在引用dll或tlb文件时都不起作用,还有其他方法可以实现吗?理想的解决方案是将cominteropdll放在与Access项目相同的目录中。是的,在有人说之前,我知道MSAccess是邪恶的,只对非常小的项目有用-但我4个月前才来到这里......Marlon你可以在Access中托管CLR:添加对mscoree的引用(可能是C:\WINDOWS\Microsoft.NETFrameworkv2.0.50727\mscoree.tlb)SubMain()DimCORHost作为新的mscoree.CorRuntimeHostDim域作为对象DimAssemblyFilename作为字符串Dim类名作为字符串Dim结果作为对象AssemblyFilename="mscorlib"Classname="System.Collections.ArrayList"CORHost.StartCORHost.CurrentDomainDomainSetResult=Domain.CreateInstance(AssemblyFilename,Classname).Unwrap()Result.Add"test"MsgBoxResult.CountEndSub这绕过了使用注册表的需要。这样做的缺点是您必须使用后期绑定对象。您还可以添加对mscorlib.tlb的引用以获取AppDomain类和其他类的类型信息。只要您的客户端系统是WindowsXP或更高版本,您就可以选择使用免注册COM。这取代了使用XML配置清单文件在系统注册表中使用regasm(或本地COM服务器的regsvr32)注册COM组件的需要。这样,您仍然可以使用标准的CreateObject调用来创建对象。如果使用清单来使用我的VB6项目中的.NetDLL。唯一的要求是VB6可执行文件和.NetDLL位于同一文件夹中。我正在使用UMMM工具在应用程序清单中自动创建依赖项。您可以使用ActCtx.Manifest属性动态加载适当的清单以免费访问.Net互操作组件类。你说你不能安装任何东西,但你可以自己将必要的东西写入注册表?我认为所有regasm所做的就是将所有内容写入注册表,因此如果它不存在,您可以在启动时从VB代码有效地执行此操作,然后您可以加载互操作程序集。您可以使用ProcessMonitor等工具来查看运行regasm时写入注册表的内容。我确保您使用-codebase开关,并为com包装器的接口和类显式定义Guid。不这样做会导致我在尝试让com-wrapped.netdll工作时遇到的问题无休止。如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
