[英]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的線程。 (我無法控制激活上下文。)
總結一下,我會說:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.