簡體   English   中英

注冊免費COM可以應用於DLL嗎?

[英]Can registration free COM be applied to a DLL?

目前,我有類似的東西用於免注冊COM設置:

  • a.exe (取決於b.dll ;不直接依賴於c.dll
  • a.exe.manifest (聲明免費注冊-COM登記c.dll
  • b.dll (取決於c.dll 。例如,.NET TMBIMP生成的COM包裝器)
  • c.dll (一些COM實現DLL)
  • c.dll.manifest (免費注冊-COM清單c.dll

是否可以更改此方案,以便將a.exe上的清單放在b.dll 我希望其他程序能夠引用b.dll而不必在任何地方添加其他清單。

a.exe.manifest有這樣的內容:

  <file name="msdia110.dll">
    <comClass description="Debug Information Accessor" clsid="{761D3BCD-1304-41D5-94E8-EAC54E4AC172}" threadingModel = "Both"/>
  </file>

c.dll.manifest是使用清單工具mt.exe生成的。 (這里包括的時間太長了)

我的經驗是它不起作用,或者你需要調用Activation Context API來實際使用DLL中的清單:請參閱此問題: 將清單文件移動到dll?

我對此的看法雖然可能不完全准確,但是:

  • 基於注冊表的COM是每個用戶的“全局”

  • Regfree清單COM是每個進程的“全局”, 應該在可執行文件上進行管理

只有可執行文件清單總是“在范圍內”,如果你的DLL有一個COM並排清單,你將被迫使用激活上下文API顯式加載它,問題是它只能工作當您確切知道何時需要它並控制DLL所在位置的調用路徑時。

因為,據我所知,當你有“a.exe.manifest(聲明c.dll的無注冊COM注冊)”時你真正做的是修改該進程的初始/全局激活上下文。 這(似乎)僅適用於可執行文件清單。 加載DLL后,DLL的任何清單都不會自動使用,因此當您需要無需注冊的COM清單時,即在CoCreateInstance之前,您必須手動執行此操作。

我有一個案例 ,我認為我知道何時調用CoCreateInstance並且我需要切換,但后來才發現DLL產生了一些自己做了一些CoCreateInstance的線程。 (我無法控制激活上下文。)

總結一下,我會說:

  • 如果您可以執行此操作,請在可執行文件中包含SxS COM清單
  • 如果您完全了解並且可以控制何時切換上下文(“手動”),則可以使用激活上下文API,但與僅在可執行文件中嵌入清單相比,這似乎更麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM