VS2005/2008問題之——由於應用程序的配置不正確,應用程序未能啓動,重新安裝應用程序可能會糾正這個問題

[VS2005、VS2008等]開發者解決“由於應用程序的配置不正確,應用程序未能啓動,重新安裝應用程序可能會糾正這個問題”

 

關鍵字:VS 2005/2008, 應用程序發佈

 

PS:

1、下面的方法我只試過VS2008,一下就好了。所以就全文轉載過來了,謝阿菜了 嘻嘻……

2、另外,又附了一篇根據VS2008不同版本編譯器的解決該問題的方法,我沒嘗試,但覺得說的挺仔細的,頂之

 

以下爲vs2005解決方法
------------------------------------------------------------------------------------------------------------------------------
今天在準備發佈用VS2005寫的那個程序時,拷貝到我同事機器上,雙擊突然出現了“由於應用程序的配置不正確,應用程序未能啓動,重新安裝應用程序可能會糾正這個問題“,這個問題很讓我意外,以前只出現過缺少DLL的情況,而這次出現這個問題,讓我一時沒辦法。想想,無非是兩個原因引起的,要麼是他沒有安裝VS2005的原因,要麼是我的程序裏依賴了其它的一些庫。於是百度一下,發現好多相關主題。我是按照這個帖子解決的:
在VS2005下用C++寫的程序,在一臺未安裝VS2005的系統上,
用命令行方式運行,提示:
“系統無法執行指定的程序”
直接雙擊運行,提示:
“由於應用程序的配置不正確,應用程序未能啓動,重新安裝應用程序可能會糾正這個問題”

以前用VC6和VS2003的話, 如果缺少庫文件,是會提示缺少“**.dll”,但是用VS2005卻沒有這樣的提示。
自己實驗了一下,感覺以下幾種解決辦法是可行的:
方法一:
在類似C:/Program Files/Microsoft Visual Studio 8/VC/redi
st/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT 下找到了下列文件:
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest
把這幾個文件拷貝到目標機器上,與運行程序同一文件夾或放到system32下,就可以正確運行了。
其他release版、MFC程序什麼的都是拷redist下相應文件夾下的文件就可以了,文件夾後都有標識!
方法二:
修改編譯選項,將/MD或/MDd 改爲 /MT或/MTd,這樣就實現了對VC運行時庫的靜態鏈接,在運行時就不再需要VC的dll了。
方法三:
工程-》屬性-》配置屬性-》常規-》MFC的使用,選擇“在靜態庫中使用mfc”
這樣生成的exe文件應該就可以在其他機器上跑了。
方法四:
你的vc8安裝盤上找到再分發包vcredist_xxx.exe和你的程序捆綁安裝 (或到這裏下載:[[原]QQ等“由於應用程序配置不正確,應用程序未能啓動…”解決之道] )
 
C#調用c++製作的DLL時,一些參數的賦值問題如char *,結構體
c++ dll中的原型
int test(char* xm,char* fa,UINT &VerNum,double Mile,char *SurvMile);
c#調用時
 [DllImport(@"Test2.DLL")]
public static extern int test(string xm,string fa,ref UInt32 VerNum,double Mile, StringBuilder SurvMile);
 
 注意:
1.調用的時候,有部分char* ,如果想獲得返回值,不能用string 作參數來進行調用,這樣得不到返回到結果,可以用StringBuilder來聲明變
 StringBuilder   strMyTemp  =   new   StringBuilder(256);//256是長度
2.結構體的引用傳遞
  首先在c#中定義和c++相同的結構體,如果是引用傳遞,在結構體前面加上[In, Out]
     [DllImport(@"test.dll")]
     public static extern int test([In, Out] SLineData[] lndt,ref UInt32 length);
3.其他的類型如整形等等用ref加上數據變量則可獲得返回值

 
使用C++調用C#的DLL
SwfDotNet是C#編寫的,作者的C#水平,真是令我佩服。這是個特別好的讀寫Swf文件的庫。但是,我要用在C++項目中,怎麼讓C++調用C#的DLL呢。今天一上午都在琢磨這個問題,耽誤了很多時間,原因是編譯是出現:
warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存爲 Unicode 格式以防止數據丟失。
接着就是一大堆的0x01等等。自己做了個Sample,仔細分析發現還是自己沒有搞清楚。正確的操作如下:
1 創建C# DLL,需要指定應用類型爲“類庫”,代碼:
namespace CSLib
{
    public class Class1
    {
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = "Your Name: " + value;
            }
        }
    }
}
2 C++客戶程序,是個控制檯應用,代碼:
#using "../debug/CSLib.dll"
using namespace CSLib;
int _tmain(int argc, _TCHAR* argv[])
{
 Class1 ^c = gcnew Class1();
 c->Name = "zzj";
 printf("%s/n", c->Name);
 return 0;
}
3 幾點要記住:
 1 使用#using引用C# DLL,而不是#include。我就是想當然的使用了後者,所以浪費了一上午的時間;
 2 別忘了using namespace CSLib;
 3 使用C++/clr語法,採用正確的訪問託管對象,即:使用帽子'^',而不是星星'*'(選擇菜單[項目]->[屬性],在其[屬性頁]中的[公共語言運行庫支持]項)
來源:http://www.cnblogs.com/lne818/archive/2008/11/07/1328845.html
========================================================================
以下爲vs2008解決方法(Csdn上的得分回覆):

http://topic.csdn.net/u/20090920/23/aa36a092-e30f-4c2b-8cc5-783a8feafdf4.html
------------------------------------------------------------------------------------------------------------------------------
如果你的是MFC程序,直接在 項目 - 屬性 - 配置屬性 - 常規 - MFC的使用 - 在靜態庫中使用MFC即可

如果你的是非MFC程序,則在 項目 - 屬性 - 配置屬性 - C/C++ - 代碼生成 - 運行庫 - 選擇“多線程”或者“多線程調試”即可

來源冰點網絡菜園:www.bingd.com , 原文地址:http://www.bingd.com/blog/html/141.htm

 

附一篇: 解決VS2008編譯的程序在某些機器上運行提示“由於應用程序配置不正確,應用程序未能啓動”的問題

 

 VC9編譯的程序在沒有裝過VC9(確切的說是.Net Framework3.5)的機器上運行時,如果提示“由於應用程序配置不正確,應用程序未能啓動。重新安裝應用程序可能會糾正這個問題。”這個錯誤,那麼就說明該程序動態鏈接了VC9的運行時庫,(如果還用到了MFC,那麼可能動態鏈接了VC9的MFC庫,同理還有ATL庫),以及缺少對應的manifest文件,程序在目標機器上沒有找到這些庫和配置文件,因此導致了這個錯誤。出現這種情況的VC9編譯器可能存在3個版本,接下來分別闡明:

1、沒有打過任何補丁的VS2008
該版本對應的CRT/MFC/ATL庫的版本號爲9.0.21022.8,這個版本號在後面會用到。這個版本的程序部署比較簡單,直接把VC安裝目錄下的redist目錄(C:/Program Files/Microsoft Visual Studio 9.0/VC/redist)中需要的庫以及對應的manifest文件拷貝到執行程序同目錄下,這樣程序到任何機器上都能夠正常運行了。

2、打過SP1補丁的VS2008
打過該補丁後,系統中存在着兩個版本的CRT/MFC/ATL庫,版本號分別爲9.0.21022.8和9.0.30729.1,這導致了manifest文件中記錄的版本號和實際庫的版本號不一致(程序要求它們的版本號一致才能運行)。這個版本的程序部署需要兩個步驟,首先要使manifest文件中依賴項的版本號與實際庫的版本號一致,均爲9.0.30729.1,方法是在工程設置中增加一個宏定義_BIND_TO_CURRENT_VCLIBS_VERSION,該宏定義於C:/Program Files/Microsoft Visual Studio 9.0/VC/include/crtassem.h文件中,然後重新編譯程序。接下來還是將VC安裝目錄下的redist目錄(C:/Program Files/Microsoft Visual Studio 9.0/VC/redist)中需要的庫以及對應的manifest文件拷貝到執行程序同目錄下,然後修改manifest文件中依賴項的版本號爲9.0.21022.8,這樣使得程序誤以爲該目錄下庫的版本號爲9.0.21022.8(實際上是9.0.30729.1版本),這樣程序到任何機器上都能夠正常運行了。

3、打過SP1補丁與SP1 ATL 安全更新 (KB973675)的VS2008
這是最新的更新。在SP1補丁之後,微軟又於近日發佈了一個用於智能設備的 Microsoft Visual Studio 2008 Service Pack 1 ATL 安全更新 (KB973675), 該補丁又將CRT/MFC/ATL庫的版本號升級,爲9.0.30729.4148,這次升級比較好,manifest文件與庫的版本號一致了,不像SP1一樣升級的不徹底。這樣只需要在工程設置中增加一個宏定義_BIND_TO_CURRENT_VCLIBS_VERSION,接下來重新編譯程序,然後直接把VC安裝目錄下的redist目錄中需要的庫以及對應的manifest文件拷貝到執行程序同目錄下,這樣程序到任何機器上都能夠正常運行了。

順便提一下,如果不想在發佈程序時帶上這些庫和manifest文件(如果沒有必要的話),那麼可以採用靜態編譯CRT和MFC,然後把manifest文件添加到資源中,這樣編譯出的程序只要一個exe就可以在任何機器上直接運行了。

參考文章:
1、“應用程序配置不正確,程序無法啓動”的解決方法資料收集:http://hi.baidu.com/fairysky/blog/item/e7a8366dbaa735f3431694c8.html
本文來源於創世軟件團隊博客, 原文地址: http://www.cnblogs.com/wondering/archive/2009/08/29/1556392.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章