我想使用未在系统范围或用户范围内注册的特定版本的 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 中,但这似乎很老套。
PS 我不确定将 ocx 重命名为 dll 是否是一种好方法,因为 AxImp 也会为 COM 内容生成同名 DLL,而且看起来没有标志可以为 COM CLR 代理显式提供输出名称。