গেটম্যানিয়েস্টের রিসোর্সস্ট্রিম NULL প্রদান করে


105

এটি একটি সি #। নেট 4.0 অ্যাপ্লিকেশন:

আমি একটি পাঠ্য ফাইলকে একটি উত্স হিসাবে এম্বেড করছি এবং তারপরে এটি একটি ডায়লগ বাক্সে প্রদর্শনের চেষ্টা করছি:

    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);
            }
        }

সমাধানটি হ'ল মাইপ্রোজজুলিউশন এবং এক্সিকিউটেবল হ'ল মাইপ্রোজ.এক্সে। Help.txt একটি এম্বেড করা সংস্থান। তবে, প্রবাহটি শূন্য। আমি মাইপ্রজলিউশন.হেল্প.টেক্সট এবং মাইপ্রোজলিউশন.মাইপ্রজ.হেল্প.টেক্সট চেষ্টা করেছি কিন্তু কিছুই কাজ করছে বলে মনে হচ্ছে না।


1
বিধানসভা ম্যানিফেস্টে .স্রোতের নামগুলি দেখতে ildasm.exe ব্যবহার করুন। দুর্দশার এই গর্তের মধ্যে পড়ে যাওয়া এড়াবেন না, পরিবর্তে প্রকল্প + বৈশিষ্ট্য, সংস্থান ট্যাব ব্যবহার করুন। সুতরাং আপনি কেবলমাত্র আপনার উত্স কোডটিতে প্রোপার্টি.সম্পাদনা.হেল্প ব্যবহার করতে পারেন।
হান্স প্যাস্যান্ট

উত্তর:


189

আপনি ব্যবহার করে সংস্থানগুলি সঠিকভাবে এম্বেড করা হয়েছে তা পরীক্ষা করতে পারেন

//From the assembly where this code lives!
this.GetType().Assembly.GetManifestResourceNames()

//or from the entry point to the application - there is a difference!
Assembly.GetExecutingAssembly().GetManifestResourceNames()

ডিবাগিং যখন। এটি আপনার কোডটিতে লিখিত আছে যে সমাবেশে এমবেড করা সমস্ত সংস্থার সমস্ত (সম্পূর্ণ যোগ্য নাম) তালিকাভুক্ত করবে।

এমএসডিএন-এ এসেম্বলি.গেটম্যানিফেস্ট রিসোর্সনাম () দেখুন ।

কেবল প্রাসঙ্গিক নামটি অনুলিপি করুন এবং ভেরিয়েবল 'রিসোর্সনেম' এ আপনি যা নির্দিষ্ট করেছেন তার পরিবর্তে এটি ব্যবহার করুন।

নোটস - সংস্থানটির নামটি কেস সংবেদনশীল এবং আপনি যদি সঠিকভাবে রিসোর্স ফাইলটি এম্বেড করে থাকেন তবে এটি getManLiveResourceNames () এ কল করে ফিরে আসা তালিকায় প্রদর্শিত হবে না। এছাড়াও - আপনি সঠিক সমাবেশ থেকে সংস্থানটি পড়ছেন তা নিশ্চিত করুন (যদি একাধিক সমাবেশগুলি ব্যবহার করা হয়) - কোনও রেফারেন্সড অ্যাসেম্বলির চেয়ে বর্তমান সম্পাদনকারী সমাবেশ থেকে সংস্থানগুলি পাওয়া খুব সহজ।

সম্পাদনা করুন .NET কোর। নেট কোর ব্যবহার করে এমবেড করার বিশদ জানতে
দয়া করে এই এসও পোস্টটি দেখুন ।

ম্যানিফেস্ট তথ্য পুনরুদ্ধার করা অনুরূপ বলে মনে হচ্ছে - কেবল ব্যবহার করুন this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames() যে কোডটি কার্যকর করছে সেখানে কেবল সমাবেশ থেকে ম্যানিফেস্ট পেতে ।

Assembly.GetExecutingAssembly()NET কোর এর সমতুল্য কীভাবে করব তা আমি এখনও বুঝতে পারি নি! যদি কেউ জানে - দয়া করে আমাকে জানান এবং আমি এই উত্তরটি আপডেট করব।


5
কাজ করেছে। প্রোজেক্টনাম.সেসোর্স.হেল্প টেক্সট এম্বেডেড রিসোর্সের নাম ছিল।
রন

2
আমি সাহায্য করে খুশি! আপনি যদি মনে করেন যে এই পোস্টটি আপনার প্রশ্নের উত্তর দিয়েছে, তবে দয়া করে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করতে ভুলবেন না।
জে

1
হ্যাঁ, তাই ইন। নেট স্ট্যান্ডার্ডটি এটি হওয়া উচিত [প্রজেক্টনাম] [[নেমস্পেস] [[সংস্থান]। আমি প্রকল্পের নাম মিস করছি। ধন্যবাদ!
বিলি জ্যাক ও'কনর

আমার সমস্যাটি getEntryAsorses () এর পরিবর্তে getExecutingAs आशीर्वाद () ব্যবহার করছিল। আমি যে সংস্থানটি চেয়েছিলাম তা নির্বাহযোগ্য ছিল, তবে সংস্থানটি লোড করার কাজটি একই সমাধানে অন্য একটি রেফারেন্সড প্রজেক্টে থাকত।
লেটসেমোড

63

আমার প্রথমে অনুরূপ ইস্যুটি পরীক্ষা করে দেখুন যে ফাইলটি আপনার প্রকল্পের অন্তর্ভুক্ত রয়েছে, তারপরে বৈশিষ্ট্যগুলিতে যান এবং এম্বেডড রিসোর্সে সেই ফাইলটির বিল্ড অ্যাকশন সেট করুন। এটি আমার জন্য কাজ করেছে।


এই আমাকে সাহায্য! আমার আগে এমন কিছু ফাইল যুক্ত হয়েছিল যা এম্বেড থাকা সংস্থানগুলিতে ডিফল্ট হয়েছিল, তারপরে যেগুলি পরে যুক্ত করেছি সেগুলি "কিছুই নয়" এ সেট করা হয়েছিল। ভিজ্যুয়াল স্টুডিও অনেক সময় বিরক্তিকর হয়। এর সবচেয়ে খারাপ দিকটি হ'ল সম্পদের জন্য সমস্ত এক্সএমএল ফাইলের বিল্ড অ্যাকশনের জন্য কোনও সেটিংস নেই। সেখানে বিল্ড অ্যাকশন সেট করা উচিত।
জন স্যুট

1
ডিফল্ট নেমস্পেস এবং রিসোর্সের পথে ব্যবহার করতে ভুলবেন না। যেমন DefatultNameSpace.Infrastructure.Help.txt। আপনার প্রকল্পের বৈশিষ্ট্য পৃষ্ঠাতে ডিফল্ট নেমস্পেস এবং আপনার Infrastructureফাইলটি যে ফোল্ডারে রয়েছে সেটি হবে
jabu.hlong

চিয়ার্সের এইটাই আমি চেয়েছিলাম!
ট্যাবি

18

এম্বেড থাকা ফাইলের "বিল্ড অ্যাকশন" বৈশিষ্ট্যটি নীচে দেওয়া হয়েছে, যা সঠিকভাবে নীচে দেওয়া হয়েছে: চালানোর জন্য "এম্বেড রিসোর্স" হিসাবে সেট করা উচিত :

Stream stream = assembly.GetManifestResourceStream(resourceName)

ফাইলটিতে ডান ক্লিক করুন, সম্পত্তিটি ক্লিক করুন এবং তারপরে "বিল্ড অ্যাকশন" বৈশিষ্ট্যটিকে "এম্বেডেড রিসোর্স" হিসাবে সেট করুন:

এখানে চিত্র বর্ণনা লিখুন


ঠিক আমার সমস্যাটি কী ছিল। ধন্যবাদ!
রিকি

1
এটা আমার সমস্যা ছিল। আমি এটি রিসোর্স.আরেক্স ব্যবহার করে যুক্ত করেছি এবং এটি কার্যকর হয়নি।
হোল্ডার লিমা

11

আমার নাল মানটির কারণ এখানে।

http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/

GetManifestResourceStreamপদ্ধতি সবসময় আয় হবেNULL রিসোর্স 'নির্মিত কর্ম' সম্পত্তি 'এমবেডেড রিসোর্স' থেকে সেট করা না থাকলে

সমস্ত প্রয়োজনীয় ফাইল সহ এই সম্পত্তিটি সেট করার পরে assembly.GetManifestResourceStreamপরিবর্তে সঠিক স্ট্রিমটি ফিরতে শুরু করে NULL


1
আবার ধন্যবাদ. এটি আমার সমস্যাটি এক মাস বা দুই মাস আগে স্থির করে ফেলেছিল আমি তখন এটি সম্পর্কে ভুলে গিয়েছিলাম এবং একই সমস্যা ছিল এবং এটি আবার এটি স্থির করেছে।
সমৃদ্ধ

8

শুধু একটি সতর্কতা।

আমি এম্বেডেড রিসোর্স হিসাবে আমার ফাইল অ্যাক্সেস করতে পারিনি যদিও আমি উল্লেখ করেছি যে এটি ছিল এবং যদিও এটিতে বিল্ড অ্যাকশন সম্পত্তি রয়েছে। অনেক সময় নষ্ট করে আমার মাথা ঠাটিয়ে। আমি .txt এর নামের (xxx.cs.txt) সাথে যুক্ত একটি সিআরএফ কোড ফাইল এম্বেড করেছি। কিছু কারণে getManLiveResourceNames () এবং GetManLiveResourceStream () পদ্ধতিগুলি তার নামে .cs সহ একটি ফাইল দেখতে পাবে না।

আমি কেবল এটির নামকরণ করেছি xxx.txt এবং সবকিছু ঠিক আছে।

রহস্যময়।


1
এটি আজ খুব বেশি সময় ব্যয় করেছে! আপনি এটি ব্যবহার করেন Resourceতবে না ব্যবহার করে এটি এটি এম্বেড করবে Embedded Resourceযা এটি এমনকি আরও অবাক করে তোলে ... .cs.নাম থেকে সরিয়ে ফেলা এটি কার্যকর করে। আহা।
ম্যাট

সমস্যাটি .cs নয়। ফাইলগুলিতে পাথ / বিভাগটি সি # ফাইল হিসাবে নয় বরং কালচারআইনফো হিসাবে স্বীকৃত।
ফ্রন্টলাইনবিজি

2
দেখে মনে হচ্ছে একটি ডাবল এক্সটেনশন সহ এটি মোটেও কাজ করে না।
ডারিওন ব্যাডলিডোন

3

আমারও একই সমস্যা ছিল, জেয়ের জন্য ধন্যবাদ আমি দেখতে পেলাম এটি ডিরেক্টরি নামে হাইফেন ছিল।

ProjectName.ResourceFolder.Sub-DirectoryProjectName.ResourceFolder.Sub_Directoryআপনি যখন রিসোর্স স্ট্রিমটি উল্লেখ করেন তখন হয়ে যায় ।


2

আমার ক্ষেত্রে সমস্যাটি হ'ল সংস্থানটি অনুসন্ধান করার কোডটি অন্য একটি প্রকল্পে ছিল যা নিজেই উত্স।

কোডটি হ'ল আপনি কেবল একই প্রকল্পে থাকা সংস্থানগুলিতে অ্যাক্সেস করতে পারবেন। আমি ভেবেছিলাম আমি ওয়েব পৃষ্ঠার প্রকল্পে আমার সমস্ত সংস্থান রাখতে পারি, তবে মেল প্রকল্পে আমারও চিত্রের প্রয়োজন।

আশা করি আমি যেমন ছিলাম তেমন কাউকে এটিকে সহায়তা করবে।

আমি সত্যিই দরকারী কলিং খুঁজে Assembly.GetExecutingAssembly().GetManifestResourceNames();


অন্তত ২০১১ সাল থেকে এটি সত্য নয়: উভয় সমাবেশের মাধ্যমে। লডফ্রোম () এবং টাইপফের মাধ্যমে আপনি অন্য কোনও প্রকল্পে থাকা সংস্থানগুলিতে অ্যাক্সেস করতে পারবেন
মার্সেলো স্কোফানো

1

যদি এটি অন্য কাউকে সহায়তা করে তবে নিশ্চিত হয়ে নিন যে Assembly.GetExecutingAssembly()এম্বেডড রিসোর্স রয়েছে এমন একই সমাবেশ থেকে লাইন কল করা হয়েছিল।


আপনি যদি এটি অন্য প্রকল্প থেকে কল করেন, এবং এই ক্ষেত্রে আপনার উচিত এসেম্বলি.লডফ্র্যাম () বা টাইপফোন ব্যবহার করা উচিত যাতে আপনি অন্য প্রকল্পে থাকা সংস্থানগুলিতে অ্যাক্সেস করতে পারেন ...
মার্সেলো স্কোফানো

1

একটি সাধারণ এবং প্রবাহিত সমাধান হ'ল এই বেস ক্লাসটি:

public class EmbededResourceReader
{
    protected string LoadString(string fileName)
    {
        return LoadString(fileName, Encoding.UTF8);
    }

    protected string LoadString(string fileName, Encoding encoding)
    {
        var assembly = this.GetType().Assembly;
        var resourceStream = assembly.GetManifestResourceStream($"{this.GetType().Namespace}.{fileName}");
        using (var reader = new StreamReader(resourceStream, encoding))
        {
            return reader.ReadToEnd();
        }
    }
}

তারপরে, আপনি যখন কোনও সংস্থান যোগ করবেন, আপনি একই ফোল্ডারে একটি পাঠক সি # শ্রেণি তৈরি করবেন:

এখানে চিত্র বর্ণনা লিখুন

যেখানে পাঠক শ্রেণি MyResource.cs খুব সহজ:

public class MyResource : EmbededResourceReader
{
    public string LoadString() => LoadString($"{nameof(MyResource)}.txt");
}

সুতরাং, প্রতিটি সংস্থার একটি "ছায়া" শ্রেণি থাকবে যা এটি সঠিকভাবে পড়তে জানে।

আপনি এইভাবে আপনার কোডটিতে সংস্থানটি পড়েন:

var text = new MyResource().LoadString();

এবং অন্যান্য উত্তরগুলির পরামর্শ হিসাবে, উত্স ফাইলের বিল্ড অ্যাকশন সম্পত্তিটিতে "এম্বেডেড রিসোর্স" সেট করতে ভুলবেন না।

এই অভিন্ন সমাধানের সুবিধাটি হ'ল

  1. সংস্থানটির সঠিক পুরো নাম সন্ধানে কম ঝামেলা, বিশেষত নেস্টেড ফোল্ডারে রাখলে
  2. যদি ফোল্ডারের নাম পরিবর্তন করা হয় বা প্রকল্প সেটিংসে ডিফল্ট নেমস্পেস পরিবর্তন করা হয়, কোডটি ভাঙবে না

0
    First Unload the project and click on edit the project file. 

    Inside the project file make sure that the item you are fetching from the assembly is included inside <EmbeddedResource> tag.

    Eg: 

         <ItemGroup>
          <EmbeddedResource Include="Template\ForExampleFile.html" />
         </ItemGroup>


    The files I added into the project were just in Content tag but not in the EmbeddedResource as shown below by default. Hence the stream was returning null.
    <ItemGroup>
        <Content Include="Template\ForExampleFile.html" />
  </ItemGroup>

0

আপনাকে আপনার সমাধানটি আনলোড করতে হবে hen তারপরে প্রকল্পটি সম্পাদনা করুন your আপনার ফোল্ডারটি পরীক্ষা করুন এবং এর মতো পরিবর্তন করুন:

<EmbeddedResource Include="yourpath" />

0

যদিও ওপি একই সমাবেশে রিসোর্সস্ট্রিমটি এনটিএল ফিরিয়ে নিয়েছে , কিছু উত্তর উত্তর দিয়েছে যে রিসোর্সগুলি যখন অন্য কোনও প্রকল্প বা অ্যাসেমব্লিতে থাকে তখন তাদের পুনরুদ্ধার করা যায় না এবং এটি গেটম্যানিয়েস্টের রিসোর্সস্ট্রিম নুল ফিরে আসার উপযুক্ত কারণ।

এটি সত্য নয়, কমপক্ষে ২০১১ সাল থেকে; যেমন আমি অন্য কোথাও কিছু মন্তব্যগুলিতে ইঙ্গিত করেছি, এসেম্বলি.ল্ডফ্রোম () বা টাইপফ কৌশলটি করেন এবং ফলস্বরূপ আপনি অন্য কোনও প্রকল্পের সংস্থানগুলিতে অ্যাক্সেস করতে পারেন।

উদাহরণস্বরূপ আমার কাছে এখানে একটি মাঝারি জটিল উদাহরণ রয়েছে; এটি আমার পরীক্ষার সেটআপ:

এখানে চিত্র বর্ণনা লিখুন

অন্য প্রকল্পের পথ:

এখানে চিত্র বর্ণনা লিখুন

এখানে বন্দী:

 var sharedXMLResource =
                "D:\\My Documents\\Consultório Impressos\\DB Pacientes\\Teste\\TestesVariados\\WinFormFramework\\Read_Embedded_XML_File_CS\\bin\\Debug\\Read_Embedded_XML_File_CS.exe";

এবং উইনফর্মফ্রেমওয়ার্ক থেকে ফর্ম 1 সি-তে আমি নির্দিষ্ট করে দিয়েছি

Namespace.Folder.Resource

সে রকমই:

StreamReader reader = 
                new StreamReader(Assembly.LoadFrom(sharedXMLResource).GetManifestResourceStream("Read_Embedded_XML_File_CS.SharedResources.ContactList.xml") ?? throw new InvalidOperationException());

এবং ফলাফল পাঠ্যবক্সে প্রদর্শিত: এখানে চিত্র বর্ণনা লিখুন

আমি এটি সঠিকভাবে পেতে বেশ কয়েক ঘন্টা ব্যয় করেছি; তার জন্য, আমাকে তাত্ক্ষণিক উইন্ডোতে এগুলি প্রচুর ব্যবহার করতে হয়েছিল:

Environment.CurrentDirectory
AppDomain.CurrentDomain.BaseDirectory
System.Reflection.Assembly.GetExecutingAssembly().Location
System.Reflection.Assembly.GetAssembly(typeof(WinFormFramework.Program)).Location

আশা করি এটি কাউকে সাহায্য করবে


-2

GetManifestResourceStreamপ্যারামিটারে আপনাকে সম্ভবত আপনার txt ফাইলের পাথ নির্দিষ্ট করতে হবে , বা আপনার এক্সিকিউটেবলের মতো একই ডিরেক্টরিতে txt ফাইলটি স্টিক করার চেষ্টা করতে পারেন। আশা করি এইটি কাজ করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.