Ini adalah aplikasi C # .NET 4.0:
Saya menyematkan file teks sebagai sumber daya dan kemudian mencoba menampilkannya di kotak dialog:
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyProj.Help.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
}
}
Solusinya adalah MyProjSolution dan yang dapat dieksekusi adalah MyProj.exe. Help.txt adalah sumber daya yang disematkan. Namun, alirannya null. Saya sudah mencoba MyProjSolution.Help.txt dan MyProjSolution.MyProj.Help.txt tetapi tidak ada yang berhasil.
Jawaban:
Anda dapat memeriksa bahwa sumber daya disematkan dengan benar menggunakan
saat debugging. Ini akan mencantumkan semua (nama yang memenuhi syarat) dari semua sumber daya yang tertanam dalam rakitan tempat kode Anda ditulis.
Lihat Assembly.GetManifestResourceNames () di MSDN.
Cukup salin nama yang relevan, dan gunakan itu alih-alih apa pun yang telah Anda tetapkan dalam variabel 'resourceName'.
Catatan - nama sumber daya peka huruf besar / kecil, dan jika Anda salah menyematkan file sumber daya, itu tidak akan muncul dalam daftar yang dikembalikan oleh panggilan ke GetManifestResourceNames (). Juga - pastikan Anda membaca sumber daya dari rakitan yang benar (jika beberapa rakitan digunakan) - terlalu mudah untuk mendapatkan sumber daya dari rakitan yang sedang dieksekusi daripada dari rakitan yang direferensikan.
EDIT - .NET Core
Silakan lihat posting SO ini untuk detail tentang cara menanamkan menggunakan .NET Core.
Pengambilan info manifes terlihat serupa - cukup gunakan
this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
untuk mendapatkan manifes dari rakitan tempat kode dijalankan.Saya belum menemukan cara untuk melakukan hal yang setara
Assembly.GetExecutingAssembly()
dengan .NET Core! jika ada yang tahu - tolong beri tahu saya dan saya akan memperbarui jawaban ini.sumber
Saya memiliki masalah serupa, periksa terlebih dahulu apakah file tersebut disertakan dalam proyek Anda, lalu buka properti dan setel tindakan pembuatan file tersebut ke Sumber Daya Tertanam. ini berhasil untuk saya.
sumber
DefatultNameSpace.Infrastructure.Help.txt
. Namespace default di halaman properti proyek Anda danInfrastructure
akan menjadi folder tempat Anda beradaProperti "Build Action" file yang disematkan harus disetel sebagai "Sumber Daya yang Tersemat" untuk menjalankan baris, yang diberikan di bawah ini, dengan benar:
Klik kanan pada file, klik properti, lalu setel properti "Build Action" sebagai "Sumber Daya Tersemat":
sumber
Inilah penyebab nilai null saya.
http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/
The
GetManifestResourceStream
Metode akan selalu kembaliNULL
jika properti sumber daya 'dibangun tindakan' tidak diatur ke 'sumber daya tertanam'Setelah menyetel properti ini dengan semua file yang diperlukan
assembly.GetManifestResourceStream
mulai mengembalikan aliran yang benar, bukanNULL
.sumber
Hanya peringatan.
Saya tidak dapat mengakses file saya sebagai sumber daya yang disematkan meskipun saya menetapkannya dan meskipun file tersebut memiliki properti Build Action. Membuang banyak waktu untuk membenturkan kepalaku. Saya menyematkan file kode csharp dengan .txt ditambahkan ke namanya (xxx.cs.txt). Untuk beberapa alasan, metode GetManifestResourceNames () dan GetManifestResourceStream () tidak akan melihat file dengan nama .cs.
Saya mengganti namanya menjadi xxx.txt dan semuanya baik-baik saja.
Aneh.
sumber
Resource
tetapi tidakEmbedded Resource
, yang membuatnya semakin aneh ... Menghapus.cs.
dari namanya membuatnya berfungsi. Argh.Saya memiliki masalah yang sama, berkat Jay, saya menemukan itu adalah tanda hubung di nama direktori.
ProjectName.ResourceFolder.Sub-Directory
menjadiProjectName.ResourceFolder.Sub_Directory
saat Anda mereferensikan aliran sumber daya.sumber
Dalam kasus saya, masalahnya adalah bahwa kode yang mencari sumber daya berada di proyek yang berbeda dari sumber daya itu sendiri.
Anda hanya dapat mengakses sumber daya dalam proyek yang sama dengan kodenya. Saya pikir saya bisa menempatkan semua sumber daya saya di proyek halaman web, tetapi saya membutuhkan gambar di proyek surat juga.
Semoga ini membantu seseorang dalam situasi yang sama dengan saya.
Saya menemukan panggilan yang sangat berguna
Assembly.GetExecutingAssembly().GetManifestResourceNames();
.sumber
Jika membantu orang lain, Pastikan
Assembly.GetExecutingAssembly()
baris dipanggil dari rakitan yang sama yang memiliki sumber daya tertanam.sumber
Solusi sederhana dan efisien adalah memiliki kelas dasar ini :
Kemudian, saat Anda menambahkan sumber daya, Anda membuat kelas C # pembaca di folder yang sama:
di mana kelas pembaca MyResource.cs sangat sederhana:
Jadi, setiap sumber daya akan memiliki kelas "bayangan" yang tahu cara membacanya dengan benar.
Ini adalah cara Anda membaca sumber daya di kode Anda:
Dan seperti jawaban lain yang disarankan, jangan lupa untuk menyetel "Sumber Daya Tersemat" di properti Tindakan Bangun dari file sumber daya.
Keuntungan dari solusi seragam ini adalah
sumber
sumber
Anda perlu membongkar solusi Anda, kemudian mengedit proyek. Setelah menemukan folder Anda dan ubah seperti ini:
sumber
Meskipun OP mendapat GetManifestResourceStream mengembalikan NULL dari sumber daya dalam Majelis yang sama, beberapa Answers menyarankan bahwa ketika Sumber daya berada di Proyek atau Majelis lain, mereka tidak dapat diambil, dan merupakan penyebab wajar GetManifestResourceStream mengembalikan NULL.
Ini tidak benar, setidaknya sejak 2011; seperti yang saya tunjukkan di beberapa komentar di tempat lain, Assembly.LoadFrom () atau typeof melakukan trik dan sebagai hasilnya Anda dapat mengakses sumber daya yang ada di proyek lain.
Saya memiliki contoh yang cukup rumit untuk diilustrasikan; ini adalah pengaturan pengujian saya:
Jalur ke proyek lain:
Diambil di sini:
Dan pada Form1.cs dari WinFormFramework saya tentukan dengan
seperti itu:
Dan hasilnya ditampilkan di textbox:
Saya menghabiskan beberapa jam untuk melakukannya dengan benar; untuk itu, saya harus banyak menggunakan ini di Immediate Window:
Semoga bisa membantu seseorang
sumber
Anda mungkin perlu menentukan jalur ke file txt Anda di
GetManifestResourceStream
parameter, atau Anda dapat mencoba menempelkan file txt di direktori yang sama dengan file yang dapat dieksekusi. Semoga membantu!sumber