如何使用C#等托管代码中的ActiveX组件嵌入式免注册清单?

时间:2014-02-21 02:42:45

标签: com interop clr com-interop registration-free-com

我想使用未在系统或用户范围内注册的特定版本的ActiveX组件。如果我使用清单文件,一切都按预期工作。但是,嵌入式清单仅适用于C ++客户端代码。

这是依赖声明

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="MapWinGIS.ocx" version="4.9.1.0" />
  </dependentAssembly>
</dependency>

如果我使用SxStrace,我会看到以下内容

INFO: Parsing Manifest File C:\OSGeo4W\bin\TestApplication.exe.
    INFO: Manifest Definition Identity is MyApplication.app,version="1.0.0.0".
    INFO: Reference: MapWinGIS.ocx,type="win32",version="4.9.1.0"
INFO: Resolving reference MapWinGIS.ocx,type="win32",version="4.9.1.0".
    INFO: Resolving reference for ProcessorArchitecture MapWinGIS.ocx,type="win32",version="4.9.1.0".
        INFO: Resolving reference for culture Neutral.
            INFO: Applying Binding Policy.
                INFO: No binding policy redirect found.
            INFO: Begin assembly probing.
                INFO: Did not find the assembly in WinSxS.
                INFO: Attempt to probe manifest at C:\OSGeo4W\bin\MapWinGIS.ocx.DLL.
                INFO: Attempt to probe manifest at C:\OSGeo4W\bin\MapWinGIS.ocx.MANIFEST.
                INFO: Attempt to probe manifest at C:\OSGeo4W\bin\MapWinGIS.ocx\MapWinGIS.ocx.DLL.
                INFO: Attempt to probe manifest at C:\OSGeo4W\bin\MapWinGIS.ocx\MapWinGIS.ocx.MANIFEST.
                INFO: Did not find manifest for culture Neutral.
            INFO: End assembly probing.
    ERROR: Cannot resolve reference MapWinGIS.ocx,type="win32",version="4.9.1.0".
ERROR: Activation Context generation failed.

显然,无论如何,它只是想要DLL。问题是我从AxImp获得的DLL没有嵌入式清单。有没有一种很好的方法来使用嵌入式清单?我觉得我可以尝试将mt嵌入到我从AxImp获得的DLL中,但这似乎是hackish。

P.S。我不确定是否将ocx重命名为dll是一个很好的方法,因为AxImp也为COM内容生成相同的名称DLL,看起来没有标志显式提供COM CLR代理的输出名称。

2 个答案:

答案 0 :(得分:2)

您的清单缺少基本条目,例如<comClass>。这就是为什么你看到Windows继续寻找另一个清单来找到它需要的东西。您找到的解决方法并不是那么好,它会将清单条目放在错误的文件中。它应该出现在EXE的清单中。

智能方法是让构建系统处理这个问题。注册.ocx并将引用的Isolated属性设置为True。这将使构建系统从注册表中读取所需的清单条目,并将它们合并到应用程序清单中。

如果您因某些原因不想让.ocx注册,请执行此操作一次。在build目录中找到.manifest文件。使用文本编辑器打开它,并将条目复制/粘贴到您的应用清单中。请注意,这可以调用DLL Hell,如果更新COM服务器,那么您的清单将会过时。总是很难排除故障,因为这将在一两年内发生,可能发生在程序员身上,而这些程序员并不知道你做了什么。

答案 1 :(得分:0)

嗯......诀窍

regsvr32 MapWinGIS.ocx
AxImp MapWinGIS.ocx
mt -inputresource:MapWinGIS.ocx;#2 -outputresource:MapWinGIS.dll;#2
regsvr32 /u MapWinGIS.ocx

为我工作。虽然它看起来并不整洁。有没有办法不将嵌入式清单复制到CLR代理和中间注册?