小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Winform集成零散dll進(jìn)exe的方法

 NaturalWill 2014-06-20

前陣子我正在一個(gè)小c# WinForms應(yīng)用程序在Visual Studio 2008中。為了簡(jiǎn)化應(yīng)用程序的部署過程,在它的所有組件捆綁成一個(gè)exe文件將使它更容易管理。But-documentation和教程上嵌入dll文件在一個(gè)exe文件是過時(shí)的,不完整的,或者只是沒有工??。

最好的例子很多 摘自一本書,貼在MSDN的博客作者。不幸的是,它不工作,不包括明確的指示或如何實(shí)現(xiàn)它。然而,它仍然提供了一個(gè)很好的起點(diǎn)。經(jīng)過一些研究,反復(fù)試驗(yàn),Visual Studio調(diào)試器的幫助下,這是解決方案。

注意:這個(gè)方法允許您將dll文件到任何子文件夾或一系列的子文件夾在您的項(xiàng)目中,而不需要改變?nèi)魏未a后的事實(shí)。如果你想放棄使用一個(gè)子文件夾(將dll文件在項(xiàng)目的根),或者使用硬編碼的子文件夾路徑包含dll文件(s)相反,有替代方法可能更合適,但是不會(huì)被覆蓋。

1)dll文件本身需要嵌入在Visual Studio項(xiàng)目中,而不是引用。在你的項(xiàng)目中,在項(xiàng)目中創(chuàng)建一個(gè)文件夾存儲(chǔ)dll文件的根(右鍵單擊項(xiàng)目名稱> >添加新文件夾)。我叫“自由”。

2)復(fù)制和粘貼你的dll(和任何附帶的支持或定義文件)到lib文件夾。本教程的目的,使用的示例dll 桂皮.

3)接下來,包括項(xiàng)目資源dll。右鍵單擊項(xiàng)目名稱>屬性(或項(xiàng)目菜單> yourprojectname 屬性)。去“資源”選項(xiàng)卡。

選擇“文件”,如下所示:

點(diǎn)擊“添加資源”,文件類型更改為“所有文件”,并導(dǎo)航到“自由”文件你的dll的位置。選擇它,然后單擊“打開”。

dll文件現(xiàn)在應(yīng)該包括項(xiàng)目資源:

4)添加一個(gè)引用dll文件的項(xiàng)目。在解決方案資源管理器窗格中,右鍵單擊“引用”>添加引用(或項(xiàng)目菜單>添加引用)。單擊Browse選項(xiàng)卡上,導(dǎo)航到lib文件夾dll所在地,選擇dll文件,并單擊“Ok”。引用你的dll將出現(xiàn)在引用文件夾在您的項(xiàng)目。

5)在默認(rèn)情況下,編制項(xiàng)目文件和引用復(fù)制到本項(xiàng)目時(shí)建立的文件夾。這將需要預(yù)防的。在“引用”文件夾,選擇您的dll文件的引用。在properties窗格(或右擊>屬性),尋找屬性命名為“復(fù)制到輸出目錄”,并將值設(shè)置為false。

接下來,選擇“自由”文件夾下的dll文件。在properties面板中,尋找屬性復(fù)制到輸出目錄,將值設(shè)置為“不要復(fù)制”。

也尋找屬性“建設(shè)行動(dòng)”,將值設(shè)置為“嵌入的資源”。這表明如何處理文件和訪問項(xiàng)目時(shí)。

最后,排除無關(guān)的文件所附的dll文件,例如幫助文件和XML定義files-they不需要在項(xiàng)目構(gòu)建時(shí)。右鍵單擊該文件(比如XML定義文件),然后單擊“從項(xiàng)目排除”。現(xiàn)在,它將不會(huì)復(fù)制到本項(xiàng)目時(shí)建立的文件夾。

6)在WinForm上執(zhí)行的代碼視圖,包括namespaceSystem.Reflections。 這是很重要的一些代碼負(fù)責(zé)加載嵌入式dll文件(年代)。

7)在代碼視圖為您執(zhí)行WinForm上,這段代碼應(yīng)該放在構(gòu)造函數(shù)方法(通常叫一樣的形式)。它需要朝見theInitializeComponent() 方法:

1
2
3
4
5
6
7
8
9
10
11
12
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string resourceName = new AssemblyName(args.Name).Name + ".dll";
string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};

在啟動(dòng)exe,這段代碼負(fù)責(zé)檢測(cè)需要什么樣的dll文件和被引用,和負(fù)載他們從嵌入的位置。

8)在代碼中執(zhí)行WinForms應(yīng)用程序視圖,您現(xiàn)在可以包括dll文件的命名空間(s)。

9)一切為了測(cè)試,您將需要實(shí)現(xiàn)代碼從dll文件的名稱空間(s),以便AssemblyResolve事件觸發(fā)。但是,如果包括代碼從dll的名稱空間(s)在構(gòu)造函數(shù)中,Application.Run() 將拋出一個(gè)“文件未找到”對(duì)你的dll文件錯(cuò)誤當(dāng)WinForms應(yīng)用程序構(gòu)建和執(zhí)行。

糾正這一點(diǎn),您需要將任何代碼使用dll文件名稱空間(s)在構(gòu)造函數(shù)方法之外的另一種方法。這是因?yàn)槭录幚沓绦虻膮R編程序不能位于相同的方法調(diào)用。這很簡(jiǎn)單,但這只是一個(gè)警告是意識(shí)到。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多