如何从像C#这样的托管代码中使用ActiveX组件的嵌入式免注册清单



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

这是依赖声明

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

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

INFO: Parsing Manifest File C:OSGeo4WbinTestApplication.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:OSGeo4WbinMapWinGIS.ocx.DLL.
INFO: Attempt to probe manifest at C:OSGeo4WbinMapWinGIS.ocx.MANIFEST.
INFO: Attempt to probe manifest at C:OSGeo4WbinMapWinGIS.ocxMapWinGIS.ocx.DLL.
INFO: Attempt to probe manifest at C:OSGeo4WbinMapWinGIS.ocxMapWinGIS.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中,但这似乎很糟糕。

附言:我不确定将ocx重命名为dll是否是一个好方法,因为AxImp也会为COM内容生成相同名称的dll,而且看起来没有明确提供COM CLR代理输出名称的标志。

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

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

如果出于某种原因不想让.ocx注册,那么只需执行一次。在生成目录中查找.manifest文件。用文本编辑器打开它,然后将条目复制/粘贴到应用程序清单中。请注意,这可能会调用DLL地狱,如果您更新COM服务器,那么您的清单将过期。总是很难排除故障,因为这将在一两年后发生,而且可能发生在一个不知道你做了什么的程序员身上。

嗯。。。的诀窍

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

为我工作。虽然看起来不整洁。有没有一种方法可以不将嵌入的清单复制到CLR代理和中间注册中?

最新更新