2011-10-18 44 views
10

背景:註冊維克斯期間.NET COM DLL安裝

我們的應用程序是一個更大的應用程序的插件。我們創建的所有東西都是大型應用程序所連接的DLL文件。由於我們的.NET(C#),DLL文件必須註冊爲COM接口。

我們有一個工作InstallShield項目,但由於很多原因,我不會在這裏進入,我們希望將其遷移到WiX。爲安裝程序完成的唯一工作就是註冊我們的COM文件的DLL文件。

問題

這裏是具有單個DLL文件的示例組件。

<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" > 
    <File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net" 
      AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" /> 
</Component> 

爲每How do you register a Win32 COM DLL file in WiX 3?接受的答案,建議增加SelfRegCost=1到文件標記。這會導致安裝過程中出現錯誤:

模塊C:\ Program files \ Product \ MyDll.dll註冊失敗。 HRESULT -2147024769。請聯繫您的支持人員。

在同一個問題的第二個答案(由羅布Menshing)建議反對這一做法,但這個文件標籤中添加:

<Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description"> 
     <ProgId Id="Your.Server.1" Description="Your ProgId description"> 
      <ProgId Id="Your.Server" Description="Your ProgId description" /> 
     </ProgId> 
    </Class> 

    <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them"> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" /> 
    </Class> 

我有點困惑,投入作爲CLSID ID。我放入一個生成的GUID並安裝它。它安裝得很好,但較大的應用程序找不到DLL文件。 (I用於從heat.exe生成的接口代碼。)

在同樣的問題中發現的另一種方法(由亞當Tegen)建議使用 heat.exe文件將myDll.dll -out my.wxs

使用輸出,我想補充這文件標籤:

<TypeLib Id="Another Guid" Language="0" MagorVersion="1"> 
    <!--Interfaces generated from heat.exe--> 
</TypeLib> 

每個方面我曾嘗試註冊.NET的COM失敗和閱讀,我沒有接近知道這樣做的正確方法的話題這麼多問題之後。我該怎麼辦?爲什麼在維克斯的其他一切相當簡單時,這是一項如此艱鉅的任務?

我應該提到的是,原來的InstallShield項目中創建一個自定義操作,將調用regasm.exe。如果一切都失敗了,這可能是一種可能性,但我寧願做正確的事情。

我剛剛發現heat.exe file myDll.dll -scom -o myDll.wxs輸出註冊表值相似,我需要什麼。現在,我如何引用DLL組件中新創建的組件?

回答

9

我剛剛發現heat.exe file myDll.dll -scom -o myDll.wxs輸出的註冊表值與我所需要的類似。

您確定關於-scom嗎? AFAIK,該選項實際上禁止COM註冊!

現在我該如何引用DLL組件內新創建的組件?

heat.exe生成的組件已經包含該DLL的File元素。所以它實際上包含了安裝和註冊DLL文件所需的一切。您不需要原始的「DLL組件」。

如果您需要將文件和它的COM註冊在單獨的組件中,那麼您將不得不從hea​​t.exe生成的組件中刪除File元素。此外,組件不能引用其他組件。儘管你可以在ComponentGroup之間引用,但是我們在我們的wixlib中大量使用了model dependencies,但這是一個相當先進的用例。

+0

所以在我的我只是添加?我的heat.exe命令應該是什麼? -scom來自我在Google上搜索時發現的一條建議。我認爲壓制COM很奇怪,但它給了我期望的CSLID。 heat.exe文件myDll.dll -o mydll.wxs? – SaulBack

+0

我使用了「heat.exe文件myDll.dll -o mydll.wxs」的輸出。謝謝 – SaulBack