<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    害人的VS2008,manifest導致“應用程序配置不正確,應用程序未能啟動”

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 在VC++2008的項目中,如何顯示地指定要使用的C++庫的版本? 

    開發環境:VS2008 SP1 + Win2003 SP2 
            因為我的VS2008安裝了SP1補丁,所以有了9.0.30729.1的MFC庫文件(MFC90.DLL MSVCR90.DLL)。 


    新建了一個MFC應用程序,編譯為RELEASE版本,叫做“test1.exe”,可以從程序中的清單文件(manifest)看到以下內容: 
    XML code
    ...   <dependency>          

    <dependentAssembly>

    <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>

    </dependentAssembly>

    </dependency>

    <dependency>

    <dependentAssembly>

    <assemblyIdentity type='win32' name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'/>

    </dependentAssembly>

    </dependency> ...



    說明本程序需要引用版本號為9.0.21022.8的MFC庫和運行時庫。 

    問題一:為什么程序在運行的時候,載入的不是9.0.21022.8版本的卻是9.0.30729.1版本的運行庫?這是在哪里進行設置的?如何改變這個版本號? 

    問題二:(雖然貌似已經解決,但是我想知道的更深一點) 
    布署的時候,把X:\VS安裝目錄\VC\redist下對應的運行庫和.manifest文件(都是9.0.30729.1版本的)復制到與test1.exe同一目錄下。在一臺完全干凈的新系統中,會出現“應用程序配置不正確,應用程序未能啟動”的錯誤。 

    后來,經過不斷的試驗,發現應用程序中的MANIFEST文件指定的是9.0.21022.8版本的運行庫,然后我使用9.0.21022.8版本的Microsoft.VC90.CRT.manifest文件替換9.0.30729.1版本的Microsoft.VC90.CRT.manifest,配合上30729版本的MFC90.DLL,程序就可以正常運行了。 

    簡單一點,就是,對于一個使用了新版本DLL功能的應用程序,有以下情況: 
    應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 新版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 不可以運行 
    應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 舊版本的運行庫MANIFEST文件 + 舊版本的運行庫DLL --> 不可以運行 
    應用程序中的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了舊的版本號] + 舊版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 可以運行 

    注:運行庫MANIFEST文件是指Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest,運行庫DLL是指MSVCR90.DLL MFC90.DLL 

    程序的清單文件不要內嵌,而使用外置的MANIFEST文件,然后手工把生成的text1.exe.manifest中的version='9.0.21022.8'改成新版本號version='9.0.30729.1' ,就可以達到以下目標了: 
    應用程序 外置的MANIFEST文件[使用了使用了新版本DLL的功能 卻指定了的版本號] + 新版本的運行庫MANIFEST文件 + 新版本的運行庫DLL --> 可以運行! 
    (內嵌清單也是資源,當然可以修改,但是不建議這么做,而且也沒必要這么做。)

    終于終于,在微軟網站找到了關于這個問題的描述。 
    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=361682 
    這的確是個BUG,具體什么時候會修復就不知道了。。。。。。。。 

    所以,內嵌清單中的版本號只能為舊版本號,因此目前只能用,舊版本的運行庫MANIFEST文件 + 新版本的運行庫DLL ,才可以運行獨立發布的程序了。。。

    在VS2008中,“項目”-->“屬性”-->“配置屬性”-->“清單工具”-->“輸入和輸出”-->“嵌入清單”-->否。

    這樣程序編譯后,假設是mytest.exe,將會產生一個mytest.exe.manifest,發布軟件時最好附帶上這個manifest文件,用記事本打開,可以看到對應MFC/CRT.manifest的版本。

    在VS2008中,“項目”-->“屬性”-->“配置屬性”-->“清單工具”-->“輸入和輸出”-->“嵌入清單”-->是。mytest.exe將包含mytest.exe.manifest,不額外產生mytest.exe.manifest。

    “配置屬性”其它設置:(1)常規-->MFC的使用:在共享DLL中使用MFC;(2)C/C++  -->檢查64位可一致性問題:否;(3)C/C++  -->代碼生成-->運行時庫:多線程調試DLL(/MDd);(4)鏈接器-->清單文件-->生成清單:是

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全