C# VB6中的.NET对象,而不使用regasm.exe?

C# VB6中的.NET对象,而不使用regasm.exe?,c#,ms-access,com,vb6,interop,C#,Ms Access,Com,Vb6,Interop,我工作的软件公司为学校开发软件,所以我们的客户机通常被锁定,这样我们就不可能在上面安装任何东西 我们的旧系统主要基于一个(非常大的)MS Access项目,因此它只需从本地文件夹运行即可解决访问问题 我的任务是将部分系统重新开发为c#.NET——不过,在过渡阶段,如果能够关闭access项目fire.NET,那就太好了 我今天已经玩了几个小时的com互操作,但要让这些工作正常,唯一的方法是在RegAsm.exe中注册它们-不幸的是,在客户端环境中这不是一个选项 我尝试过GetObject/Cre

我工作的软件公司为学校开发软件,所以我们的客户机通常被锁定,这样我们就不可能在上面安装任何东西

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

我的任务是将部分系统重新开发为c#.NET——不过,在过渡阶段,如果能够关闭access项目fire.NET,那就太好了

我今天已经玩了几个小时的com互操作,但要让这些工作正常,唯一的方法是在RegAsm.exe中注册它们-不幸的是,在客户端环境中这不是一个选项

我尝试过GetObject/CreateObject,但在引用dll或tlb文件时两者都不起作用,是否有其他方法可以实现这一点

理想的解决方案是将com互操作dll与Access项目放在同一目录中

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


Marlon

你说你不能安装任何东西,但是你能自己把必要的东西写进注册表吗?我认为regasm所做的就是将所有的东西写入注册表,这样你就可以在启动时从VB代码中有效地完成这项工作,如果它不在那里,那么你就可以加载互操作程序集了

您可以使用类似这样的工具来查看运行regasm时写入注册表的内容


我会确保您正在使用-codebase开关,并为com包装器的接口和类显式定义GUI。如果不这样做,我在尝试使com包装的.net DLL正常工作时遇到了无数问题

您可以在Access内部托管CLR:

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

这样就不需要使用注册表。缺点是必须对对象使用后期绑定


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

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


这样,您仍然可以使用标准的CreateObject调用来创建对象。

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

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


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

您好,谢谢您的帖子,听起来很有希望。我刚刚对它进行了测试,但在将域对象传递到CORHost.CurrentDomain时出现了“类型不匹配”错误。我查看了接口规范,它传递的是指针而不是对象-vb6会在意吗?(很抱歉,我的vb6技能有限)。如果您仍然得到与我更新的代码不匹配的类型,请尝试添加对mscorlib.tlb的引用并将域声明为AppDomain。您好,我仍然得到与该代码不匹配的类型,我也尝试添加对mscorlib.tlb的引用,但其中似乎没有“AppDomain”的定义。最接近的是AppDomainManager或AppDomainSetup。只有当你在其中添加了“New”时,才会出现这种情况。啊,对不起,是的,这很有效。非常感谢您提供此解决方案。我快速阅读了该教程,唯一可能的问题是,我们正在使用MS Access项目,没有编译VB6.exe,因此我认为无法使用该项目编译清单。不过,我将对此进行进一步研究。您可能需要将清单与Access主可执行文件放在一起。这有点冒险,您可能没有权限这样做。您可以在运行时加载进程清单--在XP和更高版本上,COM对象可以注册在注册表的用户部分(HKEY_CURRENT_user),您可能有权限从用户帐户写入。您可能没有全局注册COM对象的权限(在HKEY_LOCAL_机器中)。您可以将regasm的功能从HKLM转换为HKCUregasm,HKCUregasm有一个参数,可以将注册表项创建为文件-无需使用进程监视器,您可能“知道”这一点,但事实并非如此。访问不是坏事,也不是不适合大型项目。它只是需要适当地使用。您的评论意味着访问甚至没有被使用,只是Jet,因此这意味着一定程度的混乱,可能会使您难以解决问题。也就是说,如果你甚至不了解你所使用的工具的关键区别,你就不可能编写一个应用程序来使用那些你的理解水平相当模糊的工具。阅读下面的评论,你说你在“使用MS Access项目,没有编译VB6.exe”,所以我很困惑。它是VB6应用程序还是Access应用程序?如果是后者,您应该能够通过不在Access应用程序中创建引用和使用后期绑定来绕过许多问题。但是您的CreateObject注释倾向于表明您的问题实际上是无法注册所需的组件,所以这没有帮助。我不清楚问题是什么,也就是说,是.NET问题还是访问问题。简言之,没有足够的信息来真正提供答案。@David我认为问题在于Marlon想从Access应用程序调用C#对象。但他无法注册与COM兼容的C#对象,因为用户没有权限。问题是
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