2014-02-21 61 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

相關問題