2014-02-21 16 views
0

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

这里是依赖声明

<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中,但这看起来很诡异。

P.S.我不确定是否将ocx重命名为dll是一种很好的方法,因为AxImp也会为COM东西生成相同的名称DLL,并且看起来好像没有标记可显式为COM CLR代理提供输出名称。

回答

2

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

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

如果您不想离开.ocx因某种原因而注册,那么只需执行一次。找到构建目录中的.manifest文件。用文本编辑器打开它,并将条目复制/粘贴到您的应用清单中。要小心,这可以调用DLL地狱,如果你更新COM服务器,那么你的清单将过时。总是很难排除故障,因为这会在一两年后发生,可能会发生给程序员,而这些程序员不知道你做了什么。

+0

'comClass'条目被嵌入到OCX资源中的清单中。仅在C++客户端的清单中具有依赖关系就足够了。在EXE中放置一个带TLB的清单似乎有点奇怪。会尝试,但我想应该工作。尽管第二段和第三段我都有点失落。如果OCX被注册,为什么我会关心'Isolated'?如果我设置了'Isolated',为什么我会将具有TLB内容的清单从OCX复制到CLR EXE中。我不介意在开发机器上注册,但不在部署上注册。 – mlt

+0

您关心的是* *未注册时的隔离。在部署机器上。它只需要在您的开发机器上注册,以便清单条目可以自动确定。就像你用mt.exe做的那样 –

+0

我是否只是将生成的清单文件添加到项目中以便嵌入?另外奇怪的是,只有当OCX本身被添加为参考时才能设置'Isolated'。这样就不能传递类似'tlbimp'等选项,例如命名空间。 – mlt

0

嗯...有

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

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

+0

你有没有得到这个工作?我正在尝试使用MapWinGIS。 –

+0

保罗,这是永远的。我在我的OSGeo4W bin文件夹中看到了一些MW GIS TestApp,它从那里开始,因此它的工作原理与Hans建议的一样,因为Isolated设置为true,VS抱怨它没有注册。如果不介意在开发者机器上注册OCX,我认为这种方法可行。尽管我没有尝试按用户注册。然而,我最初的想法是使用CMake作为非特权用户的沉默版本。如果它对MW太具体了,这里是[phorum thread for the stuff](http://www.mapwindow.org/phorum/read.php?3,24690)。 – mlt

相关问题