วิธีการฝังไฟล์ข้อความในแอสเซมบลี. NET


118

ฉันต้องการฝังไฟล์ข้อความในแอสเซมบลีเพื่อให้ฉันสามารถโหลดข้อความได้โดยไม่ต้องอ่านจากดิสก์และเพื่อให้ทุกสิ่งที่ฉันต้องการมีอยู่ใน exe (เพื่อให้พกพาได้มากขึ้น)

มีวิธีทำไหม? ฉันคิดอะไรบางอย่างกับไฟล์ทรัพยากร?

และถ้าคุณทำได้คุณจะทำอย่างไรและคุณจะโหลดข้อความลงในสตริงได้อย่างไร?

คำตอบ:


147

คลิกขวาที่ไฟล์โครงการเลือกคุณสมบัติ

ในหน้าต่างที่เปิดขึ้นให้ไปที่แท็บทรัพยากรและหากมีเพียงลิงก์สีน้ำเงินที่อยู่ตรงกลางของหน้าแท็บให้คลิกเพื่อสร้างทรัพยากรใหม่

ใส่คำอธิบายภาพที่นี่

จากนั้นจากแถบเครื่องมือเหนือแท็บหน้าเลือกเพื่อเพิ่มไฟล์ข้อความใหม่ตั้งชื่อไฟล์นั้นจะถูกเพิ่มลงในโปรเจ็กต์ของคุณและเปิดขึ้น

หากคุณมาไกลขนาดนี้คุณสามารถพิมพ์ ResourcesTheNameYouGaveTheTextFileHere ในโค้ดของคุณในรหัสและคุณสามารถเข้าถึงเนื้อหาได้ โปรดทราบว่าในครั้งแรกที่คุณใช้คลาส Resources ในคลาสคุณจะต้องเพิ่มคำสั่งโดยใช้ (กด Ctrl + หลังจากพิมพ์ Resources เพื่อรับเมนูเพื่อให้ VS ทำแทนคุณ)

หากมีบางอย่างไม่ชัดเจนเกี่ยวกับคำอธิบายข้างต้นโปรดแสดงความคิดเห็นและฉันจะแก้ไขจนกว่าจะเสร็จสมบูรณ์หรือสมเหตุสมผล :)


1
รหัสคำสั่ง 'การใช้' จะเป็นอย่างไรฉันกำลังดิ้นรนเพื่อให้ได้ผล ฉันได้เพิ่ม solutions.txt เป็นทรัพยากรแล้ว แต่ไม่พบ Resources.solutions - ฉันรู้สึกว่าไม่มีคำสั่งในการใช้
Spedge

3
อ่าฮะสิ่งที่ฉันต้องทำคือเพิ่มไฟล์. ไปด้านหน้า (เช่น My.Resources.solutions) Simples!
Spedge

2
การเพิ่มทรัพยากรสร้างและรวมProperties\Resources.Designer.csกับเพื่อให้คุณมีการใช้งานnamespace YourProjectRootNamespace.Properties ถูกกำหนดไว้ในคุณสมบัติของโครงการของคุณใน VisualStudio YourProjectRootNamespace.PropertiesProjectRootNamespace
ilyaigpetrov

1
หากฉันเพิ่มไฟล์ข้อความในลักษณะนี้และบอกว่าไฟล์ข้อความเป็นส่วนหนึ่งของโซลูชันของฉัน ... หากไฟล์นั้นได้รับการอัปเดตและฉันสร้างแอสเซมบลีใหม่ทรัพยากรในตัวจะได้รับการอัปเดตด้วยหรือไม่ หรือฉันจะต้องลบ / เพิ่มไฟล์ด้วยตนเองถ้าฉันเคยเปลี่ยน?
Peter Tirrell

3
ไฟล์จะรวมอยู่ในทรัพยากรในเวลาคอมไพล์ไม่ใช่เมื่อคุณเพิ่ม คุณสามารถเปลี่ยนไฟล์ได้อย่างอิสระในเครื่องมือใดก็ได้ที่คุณต้องการและสร้างใหม่การเปลี่ยนแปลงจะเป็นส่วนหนึ่งของการประกอบของคุณ
Lasse V.Karlsen

38

ใน Visual Studio 2003, Visual Studio 2005 และเวอร์ชันก่อนหน้านี้ (ใช้ได้ในปี 2008 เช่นกัน) คุณสามารถรวมไฟล์ข้อความไว้ในโปรเจ็กต์ของคุณจากนั้นในแผง "คุณสมบัติ" ให้ตั้งค่าการดำเนินการเป็น "ทรัพยากรในตัว" จากนั้นคุณสามารถเข้าถึงไฟล์เป็นสตรีมโดยใช้Assembly.GetManifestResourceStream(string).

คำตอบอื่น ๆ ที่นี่สะดวกกว่า ฉันรวมไว้เพื่อความสมบูรณ์

โปรดทราบว่าวิธีนี้ใช้ได้กับการฝังไฟล์ประเภทอื่น ๆ เช่นรูปภาพไอคอนเสียง ฯลฯ ...


8
หมายเหตุ: ใช้เนมสเปซ + ชื่อไฟล์เป็นพารามิเตอร์สำหรับ GetManifestResourceStream () เช่น "MyNamespace.MyTextfile.txt" คุณยังสามารถเรียก GetManifestResourceNames () เพื่อรับรายชื่อทั้งหมด
Stiefel

32

หลังจากฝังไฟล์ข้อความแล้วให้ใช้ไฟล์นั้นที่ใดก็ได้ในโค้ดเช่นนี้ ...

global::packageName.Properties.Resources.ThatFileName

3
นี่เป็นแนวทางที่ดีกว่ามากเนื่องจากจะทำให้เกิดข้อผิดพลาดของคอมไพเลอร์หากทรัพยากรถูกลบออก นอกจากนี้ยังกำจัดการพิมพ์ผิด ขอบคุณสำหรับโพสต์
Ben Gripka

5 ฉันสามารถเขียนกลับไปยังไฟล์ภายในระดับ C # DLL ได้หรือไม่?
Prajwal Bhat

1
จะเป็นอย่างไรหากต้องการระบุThatFileNameจากตัวแปร
c00000fd

4

ใช่คุณถูกต้อง - สร้างไฟล์ทรัพยากร เมื่อคุณทำโดยที่คุณไม่จำเป็นต้อง "โหลด" สตริงก็จะถูกอ้างถึงเป็น Resource.WhateverStringYouDefined


2

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (ฉันต้องการอ่านเนื้อหาของไฟล์ที่ฝังอยู่ในไฟล์อิมเมจ. NET ที่ปฏิบัติการได้)

ก่อนที่จะทำอะไรให้รวมไฟล์ของคุณลงในโซลูชันของคุณใน Visual Studio (ในกรณีของฉัน VS 2017 Community) ฉันเปลี่ยนไปที่โฟลเดอร์Solution Explorerแล้วคลิกขวาPropertiesเลือกAdd Existing Itemและเลือกไฟล์ (พูดFileName.txt.) จากนั้นในขณะที่ยังคงอยู่ในSolution Explorerคลิกขวาที่ไฟล์รวมถึงการเลือกPropertiesและเลือกเป็นBuild ActionEmbedded Resource

จากนั้นใช้รหัสนี้เพื่ออ่านไบต์:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

ทราบว่าในกรณีนี้คุณไม่จำเป็นต้องเพิ่มแฟ้มที่เป็นทรัพยากรตามที่ได้เสนอในคำตอบที่ได้รับการยอมรับ


1

นี่คือสิ่งที่ฉันทำ:

  1. เพิ่มไฟล์ของฉัน (ทรัพยากร) ใน Visual Studio โดยคลิกขวาที่โครงการ
  2. คลิกขวาที่ไฟล์ทุกไฟล์ที่คุณเพิ่มและเปลี่ยน "Build Type" เป็น Embedded Resource
  3. ในการเข้าถึงทรัพยากร:

    รับแอสเซมบลีปัจจุบันโดยใช้ฟังก์ชัน:GetExecutingAssembly()

    ข ทรัพยากรที่ฉันเพิ่มเป็นไฟล์ข้อความดังนั้นฉันจึงอ่านลงในสตรีมโดยใช้GetManifestResourceStream(fileName). วิธีที่ฉันเข้าถึงชื่อไฟล์คือการโทรGetManifestResourceNames()

    ค. ตอนนี้ใช้StreamReader()คลาสเพื่ออ่านจนจบไฟล์เป็นตัวแปรถ้านั่นคือสิ่งที่คุณต้องการ


0

การเพิ่มคำตอบของ Pavan เพื่อรับการประกอบปัจจุบัน (ในส่วนทั่วไป):

Assembly _assembly;

GetManifestResourceStream (fileName) (ในโค้ดซึ่งจำเป็นต้องอ่านจากทรัพยากร):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.