使用.Net 4和VS2010创建ActiveX.exe

我的应用程序是vb6应用程序,它指的是delphi active.exe文件。 我需要用C#one替换这个文件。 如何使用VS 2010和C#创建activeX exe?

(不用说我不能使用其他文件,然后使用activeX exe)

Microsoft提供了一个关于将VB6 ActiveX EXE迁移到.NET的教程 。 它具体说明:

Visual Basic 2005升级向导不支持升级Visual Basic 6 ActiveX EXE

因此,Microsoft工具至少不支持基于原始VB6代码从.NET生成ActiveX EXE。 (这并不意味着可能无法使用其他路线。)

另一种方法可能是将它转换为常规的.NET COM Interop DLL,这很容易,但您可能需要它来运行DLL无法执行的进程外。

据我所知,VB6 ActiveX EXE本质上是一个进程外的COM服务器。

(可能存在一些微妙之处,这意味着这些概念不是完全相同的,但我认为这是主要的想法)。

肯定有几种方法可以从.NET创建进程外COM服务器。 这个问题有几个很好的答案 。

以下是我读过的所有不同基本技术的摘要。


[A]一种方法是使用“代理”进程来托管DLL 。 请注意,这类似于在32位和64位之间进行交叉调用的技术。

从这篇描述一种方法的微软文章中 ,关键点是:

  • 步骤1:使用COM可见类型和接口构建.NET程序集

  • 步骤2:为COM互操作注册.NET程序集

  • 步骤3:在GAC中安装.NET程序集

  • 步骤4:为程序集配置默认的COM代理进程

  • 步骤5:使用CLSCTX_LOCAL_SERVER激活COM对象

我认为它的第4步和第5步确实是这种方法的关键。


[B1]第二种方法是通过…… 创建“ 在托管代码中完全实现的COM EXE服务器 ”

通过满足COM规范规定的此类服务器的所有要求,将.NET EXE程序集完全打扮成COM本地服务器。

它声明这样做符合以下要求并显示了一个示例:

为我们要导出到COM的每个.NET类提供一个类工厂类(实现COM IClassFactory接口)。

正确插入EXE程序集的注册表项,包括LocalServer32项。

在这些工厂类上适当地调用CoRegisterClassObject()和CoRevokeClassObject()。


[B2]这里似乎是一个不同的例子 。 它指出:

该示例演示了本地服务器(EXE)forms的进程外COM服务器,该服务器完全在Visual C#中实现。

这可能在某些技术细节上有所不同(我还没有真正评估过这可能会有多么不同。)


[C]可能另一种方法是“使用System.EnterpriseServices.ServicedComponent创建COM +组件”( 在此链接上简要描述了SO )。