একটি সংকলিত নির্বাহযোগ্য মধ্যে এমএলডিং DLL


618

একটি প্রাক-বিদ্যমান ডিএলএলকে একটি সংকলিত সি # এক্সিকিউটেবল (যাতে আপনার বিতরণ করার জন্য কেবল একটি ফাইল থাকে) তে এম্বেড করা সম্ভব? যদি এটি সম্ভব হয় তবে এটি কীভাবে করা সম্ভব?

সাধারণত, আমি কেবল ডিএলএলগুলি বাইরে রেখে সেটআপ প্রোগ্রামটি সমস্ত কিছু পরিচালনা করার মাধ্যমে শীতল, তবে কর্মস্থলে দু'জন লোক আছেন যারা আমাকে এটি জিজ্ঞাসা করেছেন এবং আমি সত্যই জানি না।


আমি আপনাকে NETZ ইউটিলিটিটি যাচাই করার জন্য সুপারিশ করব যা আপনার পছন্দসই একটি স্কিম দিয়ে সমাবেশকে সংকুচিত করে: http://madbet.com/netz/help.php#single
নাথান বাউলচ

2
এটি সম্ভব, তবে আপনি বড় নির্বাহযোগ্য (বেস 64 আপনার ডিলকে এনকোড করতে ব্যবহৃত হবে) দিয়ে শেষ করবেন।
Paweł Dyda

আইএলমার্জ ছাড়াও , যদি আপনি কমান্ড লাইন সুইচগুলি নিয়ে বিরক্ত না করতে চান তবে আমি সত্যিই ILMerge-Gui এর প্রস্তাব দিই । এটি একটি ওপেন সোর্স প্রকল্প, সত্যিই ভাল!
টায়রন

2
@ পাওয়েডায়দা: আপনি কাঁচা বাইনারি ডেটা পিই ইমেজে এম্বেড করতে পারেন ( আরসিডিটিএ দেখুন )। কোন রূপান্তর প্রয়োজন (বা প্রস্তাবিত)।
IInspectable

উত্তর:


761

আমি কাস্টুরা.ফডি ব্যবহারের জন্য অত্যন্ত পরামর্শ দিচ্ছি - আপনার সমাবেশে সংস্থানগুলি সন্ধান করার সর্বোত্তম এবং সহজতম উপায়। এটি নিউগেট প্যাকেজ হিসাবে উপলব্ধ।

Install-Package Costura.Fody

প্রকল্পে এটি যুক্ত করার পরে এটি আউটপুট ডিরেক্টরিতে অনুলিপি করা সমস্ত রেফারেন্স স্বয়ংক্রিয়ভাবে আপনার মূল সমাবেশে এম্বেড করবে । আপনি আপনার প্রকল্পের একটি লক্ষ্য যুক্ত করে এম্বেড করা ফাইলগুলি পরিষ্কার করতে চাইতে পারেন:

Install-CleanReferencesTarget

আপনি পিডিবি'র অন্তর্ভুক্ত করবেন কিনা তা নির্দিষ্ট করতে পারবেন, নির্দিষ্ট অ্যাসেম্বলিগুলি বাদ দেবেন না বা উড়ে যাওয়ার সময় অ্যাসেমব্লিগুলি বের করবেন কিনা তাও আপনি নির্দিষ্ট করতে সক্ষম হবেন। যতদূর আমি জানি, অব্যবস্থার অ্যাসেম্বলিগুলিও সমর্থিত।

হালনাগাদ

বর্তমানে, কিছু লোক ডিএনএক্সের জন্য সমর্থন যুক্ত করার চেষ্টা করছে ।

আপডেট 2

সর্বশেষতম ফডি সংস্করণের জন্য আপনার এমএসবিল্ড 16 (তাই ভিজ্যুয়াল স্টুডিও 2019) থাকতে হবে। ফডি সংস্করণ ৪.২.১ এমএসবিল্ড ১৫ করবে reference (তথ্যসূত্র: ফডি কেবল এমএসবিল্ড ১ 16 এবং তারপরে সমর্থিত Current বর্তমান সংস্করণ: ১৫ )


79
দুর্দান্ত এই পরামর্শের জন্য আপনাকে ধন্যবাদ। প্যাকেজটি ইনস্টল করুন এবং আপনার কাজ শেষ হয়েছে। এটি ডিফল্টরূপে অ্যাসেমব্লিকেও সংকুচিত করে।
ড্যানিয়েল

9
'আমিও' হতে ঘৃণা করি, তবে আমিও - এটি আমাকে অনেক মাথা ব্যাথা থেকে বাঁচিয়েছিল! সুপারিশ করার জন্য আপনাকে ধন্যবাদ! এটি আমাকে একক এক্সে পুনঃ বিতরণের জন্য প্রয়োজনীয় সমস্ত কিছু প্যাকেজ করতে সক্ষম করেছে এবং এটি এখন মূল এক্সি থেকে ছোট এবং dlls একত্রিত হয়েছিল ... আমি কেবল এটি কয়েক দিনের জন্য ব্যবহার করছি, তাই আমি বলতে পারি না যে আমি ' এটিকে তার গতিতে পেরেছি, তবে খারাপ কিছু পপিং ব্যতীত আমি দেখতে পাচ্ছি যে এটি আমার সরঞ্জামবক্সে একটি নিয়মিত সরঞ্জাম হয়ে উঠছে। এটা ঠিক কাজ করে!
ম্যাটসেল

19
এটি জোশ. তবে এর অসুবিধাও রয়েছে: উইন্ডোজে উত্পন্ন সমাবেশটি এখন আর মনো লিনাক্সের সাথে বাইনারি সামঞ্জস্যপূর্ণ নয়। এর অর্থ, আপনি সরাসরি লিনাক্স মনোতে অ্যাসেম্বলি স্থাপন করতে পারবেন না।
টাইলার দীর্ঘ

7
এটি খুবই সুন্দর! আপনি যদি vs2018 ব্যবহার করছেন তবে আপনার প্রকল্পের মূলে থাকা FodyWeavers.xML ফাইলটি ভুলে যাবেন না।
অ্যালান দীপ

4
সর্বশেষ মন্তব্যের পরিপূরক হিসাবে: আপনার প্রকল্পে নিম্নলিখিত সামগ্রীটির সাথে FodyWeavers.xML যুক্ত করুন: <? এক্সএমএল সংস্করণ = "1.0" এনকোডিং = "utf-8"?> <তাঁতাদের যাচাই করুন = "সত্য"> <কস্টুরা /> </
wevers

88

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

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");

    dllName = dllName.Replace(".", "_");

    if (dllName.EndsWith("_resources")) return null;

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

    byte[] bytes = (byte[])rm.GetObject(dllName);

    return System.Reflection.Assembly.Load(bytes);
}

এখানে আমার আসল ব্লগ পোস্টটি: http://codeblog.larsholm.net/2011/06/e એમ્બેડ-dlls-easily-in-a-net-asorses/


6
আপনি এই আচরণটি বাক্সের বাইরে রাখতে পারেন। আমার উত্তর দেখুন stackoverflow.com/a/20306095/568266
ম্যাথিয়াস

4
অ্যাশরউ থেকে আপনার ব্লগে একটি অবিলম্বে দরকারী মন্তব্য নোট করাও গুরুত্বপূর্ণ: আপনার যদি একটি কাস্টম থিম ইনস্টল থাকে তবে এটি উপস্থাপনা ফ্রেমওয়ার্কটি সমাধান করার চেষ্টা করবে meএটি অ্যাসেম্বলি যা ক্রাশ এবং জ্বলছে! অ্যাশরউয়ের পরামর্শ অনুসারে, আপনি dllName তে প্রেজেন্টেশন ফ্রেমওয়ার্কটি রয়েছে কিনা তা সহজেই পরীক্ষা করতে পারবেন: যদি (dllName.ToLower ()। থাকে ("উপস্থাপনা ফ্রেমওয়ার্ক")) রিটার্ন নাল;
ইয়াসারবাহমান

4
এই সম্পর্কে দুটি মন্তব্য। একটি: আপনার bytesনাল কিনা তা পরীক্ষা করা উচিত এবং যদি তাই হয় তবে সেখানে নালায় ফিরে আসুন। এটা তোলে Dll হয় সম্ভব না সংস্থানে আপনার, সব পরে। দুই: এটি কেবল তখনই কাজ করে যদি class অ্যাসেম্বলির কোনও শ্রেণির জন্য যদি সেই শ্রেণীর নিজের কাছে "ব্যবহার" না থাকে। কমান্ড লাইন সরঞ্জামগুলির জন্য, আমাকে আমার আসল প্রোগ্রাম কোডটি একটি নতুন ফাইলে সরিয়ে নিয়ে যেতে হয়েছিল এবং একটি ছোট নতুন মূল প্রোগ্রাম তৈরি করতে হয়েছিল যা কেবল এটি করে এবং তারপরে পুরানো শ্রেণীর মূল মূলটিকে কল করে।
নায়ারগডস

2
এই পদ্ধতির বিপরীতটি হ'ল এটি পছন্দসই কার্যকারিতা অর্জন করতে কোনও বাহ্যিক libs ইনস্টল করার উপর নির্ভর করে না। এই পদ্ধতির খারাপ দিকটি হ'ল এটি কেবল তখনই কার্যকর যখন এটি ম্যানেজড ডলগুলির ক্ষেত্রে আসে - ইন্টারপ ডলস (কমপক্ষে আমার পরীক্ষা যতদূর যায়) অ্যাসেমব্রিলসোভ ইভেন্টটি চালিত করে না এবং এমনকি তারা অ্যাসেমব্লিটি করে থাকলেও o লোড (<কিছু ইন্টারপের বাইটস) .dll>) রাস্তায় কাঙ্ক্ষিত প্রভাব অর্জন করে না। stackoverflow.com/questions/13113131/… বিষয়টি সম্পর্কে আমার 2 সি
এক্সডিএস

3
যদি কেউ আমার ইস্যুটি চালিয়ে যায় : যদি .dllনামেরটিতে কোনও হাইফেন থাকে (অর্থাত্ twenty-two.dll), সেগুলিও একটি আন্ডারস্কোর (অর্থাত twenty_two.dll) দিয়ে প্রতিস্থাপন করা হবে । আপনি কোডের এই লাইনটি এতে পরিবর্তন করতে পারেন:dllName = dllName.Replace(".", "_").Replace("-", "_");
মাইকা ভার্টাল

87

যদি সেগুলি প্রকৃতপক্ষে পরিচালিত সমাবেশ হয় তবে আপনি আইএলমার্জ ব্যবহার করতে পারেন । নেটিভ ডিএলএলগুলির জন্য আপনার আরও কিছু কাজ করতে হবে।

আরও দেখুন: কীভাবে একটি সি ++ উইন্ডোজ একটি সি # অ্যাপ্লিকেশন এক্সে একীভূত করা যায়?


আমি নেটিভ ডিএলএল সংযুক্তিতে আগ্রহী, কোনও উপকরণ আছে কি?
বায়ান হুয়াং


এ @BaiyanHuang বর্ণন github.com/boxedapp/bxilmerge , যা এই ধারণার নেটিভ ডিএলএল জন্য "ILMerge" করা হয়।
আর্টেম রাজ্জিন

আমার মতো ভিবি নেট বিকাশকারীরা C++লিঙ্কটিতে তার সাথে ভয় পাবেন না । ILMerge খুব সহজেই ভিবি নেট এর জন্য কাজ করে। এখানে https://github.com/dotnet/ILMerge দেখুন । ধন্যবাদ @ শোগ 9
ইভান ফেরার ভিলা

26

হ্যাঁ, গ্রন্থাগারগুলির সাথে .NET এক্সিকিউটেবলগুলি মার্জ করা সম্ভব। কাজটি সম্পন্ন করার জন্য একাধিক সরঞ্জাম উপলব্ধ রয়েছে:

  • আইএলমার্জ এমন একটি ইউটিলিটি যা একাধিক .NET অ্যাসেম্বলিগুলিকে একক সমাবেশে মার্জ করার জন্য ব্যবহার করা যেতে পারে।
  • মনো মেকবান্ডল , একটি এক্স প্যাকেজ এবং সমস্ত অ্যাসেমব্লিকে লাইবমনো সহ একটি একক বাইনারি প্যাকেজে প্যাকেজ করে।
  • আইএল- রেপ্যাক হ'ল কিছু অতিরিক্ত বৈশিষ্ট্য সহ আইএলমার্জের একটি FLOSS পরিবর্তক।

এছাড়াও এটি মনো লিঙ্কারের সাথে একত্রিত হতে পারে যা অব্যবহৃত কোড সরিয়ে দেয় এবং এর ফলে ফলস্বরূপ সমাবেশটি আরও ছোট করে smaller

.NETZ ব্যবহার করা অন্য সম্ভাবনা হ'ল এটি কেবল কোনও সমাবেশকে সংকুচিত করার অনুমতি দেয় না, তবে ডেলগুলি সরাসরি এক্সেও প্যাক করতে পারে। উপরে উল্লিখিত সমাধানগুলির পার্থক্য হ'ল। নেটগুলি সেগুলি একীভূত করে না, তারা পৃথক অ্যাসেম্বলিতে থাকে তবে একটি প্যাকেজে প্যাক হয়।

.NETZ একটি ওপেন সোর্স সরঞ্জাম যা মাইক্রোসফ্ট। নেট ফ্রেমওয়ার্ক এক্সিকিউটেবল (এক্সি, ডিএলএল) ফাইলগুলিকে আরও ছোট করার জন্য সংকুচিত করে এবং প্যাক করে।



বাহ - আমি ভেবেছিলাম অবশেষে এটি খুঁজে পেয়েছি, তারপরে আমি এই মন্তব্যটি পড়েছি। এটি পুরোপুরি চলে গেছে বলে মনে হচ্ছে। কোন কাঁটাচামচ আছে?
মাফাই

ঠিক আছে, এটি সবেমাত্র গিটহাব এ চলে গেছে এবং এটি আর ওয়েবসাইটে লিঙ্ক হয় না ... সুতরাং "সম্পূর্ণরূপে চলে গেছে" একটি অতি উত্সাহব্যঞ্জক। সম্ভবত এটি আর সমর্থিত নয়, তবে এটি এখনও রয়েছে। আমি লিঙ্কটি আপডেট করেছি।
ববি

20

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

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

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

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
    {
        string assemblyName = new AssemblyName(args.Name).Name;
        if (assemblyName.EndsWith(".resources"))
            return null;

        string dllName = assemblyName + ".dll";
        string dllFullPath = Path.Combine(GetMyApplicationSpecificPath(), dllName);

        using (Stream s = Assembly.GetEntryAssembly().GetManifestResourceStream(typeof(Program).Namespace + ".Resources." + dllName))
        {
            byte[] data = new byte[stream.Length];
            s.Read(data, 0, data.Length);

            //or just byte[] data = new BinaryReader(s).ReadBytes((int)s.Length);

            File.WriteAllBytes(dllFullPath, data);
        }

        return Assembly.LoadFrom(dllFullPath);
    };
}

এখানে কীটি কোনও ফাইলের বাইটগুলি লিখতে হবে এবং এর অবস্থান থেকে লোড করা হবে। মুরগি ও ডিমের সমস্যা এড়াতে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি অ্যাসেম্বলিতে অ্যাক্সেস করার আগে হ্যান্ডলারটি ঘোষণা করেছেন এবং আপনি লোডিং (অ্যাসেম্বলি রিলিজিং) অংশের ভিতরে অ্যাসেমব্লিল সদস্যদের (বা সমাবেশের সাথে মোকাবিলা করার জন্য যে কোনও কিছু ইনস্ট্যান্টিয়েট করবেন) অ্যাক্সেস করবেন না। এছাড়াও নিশ্চিত করার যত্ন নিতে GetMyApplicationSpecificPath()কোন টেম্প ডিরেক্টরি যেহেতু টেম্প ফাইল অন্যান্য প্রোগ্রামের দ্বারা বা আপনি নিজের (না করে যখন আপনার প্রোগ্রাম Dll অ্যাক্সেস করছে যে এটি মুছে ফেলা হবে মুছে ফেলা পেতে চেষ্টা করা যেতে পারে না, কিন্তু অন্তত তার একটি উত্পাত। AppData ভালো অবস্থান)। এছাড়াও নোট করুন যে প্রতিবার আপনাকে বাইটগুলি লিখতে হবে, আপনি ঠিক অবস্থানটি লোড করতে পারবেন না কারণ ইতিমধ্যে সেখানে dll থাকে।

পরিচালিত ডিলেসের জন্য আপনার বাইটগুলি লেখার দরকার নেই, তবে সরাসরি ডেলির অবস্থান থেকে লোড করুন, বা কেবল বাইটগুলি পড়ুন এবং মেমরি থেকে অ্যাসেম্বলি লোড করুন। এটি বা এর মতো:

    using (Stream s = Assembly.GetEntryAssembly().GetManifestResourceStream(typeof(Program).Namespace + ".Resources." + dllName))
    {
        byte[] data = new byte[stream.Length];
        s.Read(data, 0, data.Length);
        return Assembly.Load(data);
    }

    //or just

    return Assembly.LoadFrom(dllFullPath); //if location is known.

যদি সমাবেশটি সম্পূর্ণরূপে পরিচালনা না করে থাকে তবে আপনি এই লিঙ্কটি দেখতে পাবেন বা কীভাবে এই জাতীয় ঘরগুলি লোড করবেন।


মনে রাখবেন যে রিসোর্সের "বিল্ড অ্যাকশন" "এম্বেডেড রিসোর্স" এ সেট করা দরকার।
মাভামার্টেন

পছন্দ করুন যদি এটি আগেই প্রকল্পের রিসোর্স.রেক্সে যুক্ত হয় তবে আপনার এটি করার দরকার নেই।
নাইয়ারগডস

2
EAZfuscator এখন বাণিজ্যিক।
টেলিমেট

16

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

AppDomain.CurrentDomain.AssemblyResolve += (sender, bargs) =>
        {
            String dllName = new AssemblyName(bargs.Name).Name + ".dll";
            var assem = Assembly.GetExecutingAssembly();
            String resourceName = assem.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
            if (resourceName == null) return null; // Not found, maybe another handler will find it
            using (var stream = assem.GetManifestResourceStream(resourceName))
            {
                Byte[] assemblyData = new Byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        };

1
কিছুটা বদলেছে, কাজটা করেছে, টিএনএক্স বন্ধু!
শান এড ম্যান

প্রকল্পটি libz.codeplex.com এই প্রক্রিয়াটি ব্যবহার করে তবে এটি আপনার জন্য ইভেন্ট হ্যান্ডলারটি পরিচালনা এবং " পরিচালিত এক্সটেনসিবিলিটি ফ্রেমওয়ার্ক ক্যাটালগগুলি " না ভাঙার জন্য কিছু বিশেষ কোড পরিচালনা করার মতো কিছু অন্যান্য কাজ করবে (যা নিজেই এই প্রক্রিয়াটি ভেঙে ফেলবে)
স্কট চেম্বারলাইন

দারুণ!! ধন্যবাদ @ স্টিভ
আফজাল

14

উপরে @ ববির অ্যাঞ্জার উপর প্রসারিত করতে । আপনি যখন নির্মাণ করবেন তখন সমস্ত ফাইলকে স্বয়ংক্রিয়ভাবে একক সমাবেশে প্যাকেজ করতে IL- Repack ব্যবহার করতে আপনি নিজের .csproj সম্পাদনা করতে পারেন ।

  1. সাথে Nuget ILRepack.MSBuild.Task প্যাকেজ ইনস্টল করুন Install-Package ILRepack.MSBuild.Task
  2. আপনার .csproj এর আফটার বিল্ড বিভাগটি সম্পাদনা করুন

এখানে একটি সাধারণ নমুনা যা আপনার প্রকল্পের আউটপুটে উদাহরণসৌধ টোমার্জ.ডিলকে একত্রিত করে।

<!-- ILRepack -->
<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">

   <ItemGroup>
    <InputAssemblies Include="$(OutputPath)\$(AssemblyName).exe" />
    <InputAssemblies Include="$(OutputPath)\ExampleAssemblyToMerge.dll" />
   </ItemGroup>

   <ILRepack 
    Parallel="true"
    Internalize="true"
    InputAssemblies="@(InputAssemblies)"
    TargetKind="Exe"
    OutputFile="$(OutputPath)\$(AssemblyName).exe"
   />
</Target>

1
আইএল-রেপ্যাকের সিনট্যাক্সটি পরিবর্তিত হয়েছে, সংযুক্ত গিথুব রেপোতে রয়েছে এমন README.md পরীক্ষা করুন ( github.com/peters/ILRepack.MSBuild.Task )। এই পথটিই কেবল আমার পক্ষে কাজ করেছিল এবং আমি অন্তর্ভুক্ত করতে চেয়েছি এমন সমস্ত ঘরের সাথে মেলে আমি একটি ওয়াইল্ডকার্ড ব্যবহার করতে সক্ষম হয়েছি।
Seabass77

8

আপনি এম্বেড থাকা সংস্থান হিসাবে ডিএলএলগুলি যুক্ত করতে পারেন এবং তারপরে আপনার প্রোগ্রামটি প্রারম্ভকালে অ্যাপ্লিকেশন ডিরেক্টরিতে আনপ্যাক করে (তারা সেখানে ইতিমধ্যে আছে কিনা তা পরীক্ষা করার পরে)।

সেটআপ ফাইলগুলি তৈরি করা এত সহজ, যদিও আমি মনে করি না এটির পক্ষে এটি উপযুক্ত হবে।

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


এখানে আপনার কাছে একটি দুর্দান্ত নিবন্ধ রয়েছে যা এটি কীভাবে তা ব্যাখ্যা করে: কোডড্রজেক্ট
ব্লু করুন

8

আর একটি পণ্য যা এই মার্জিতভাবে পরিচালনা করতে পারে তা হ'ল স্মার্টএ্যাস্পোশন, স্মার্টআস্যাবল্প.কম এ । এই পণ্যটি সমস্ত নির্ভরতা একক ডিএলএলে মার্জ করার পাশাপাশি, (বিকল্পভাবে) আপনার কোডটি অবলম্বন করবে, ফলস্বরূপ ফাইলের আকার হ্রাস করার জন্য অতিরিক্ত মেটা-ডেটা সরিয়ে ফেলবে এবং রানটাইম কার্যকারিতা বাড়ানোর জন্য আইএলকেও অনুকূলিত করতে পারে।

কিছু ধরণের গ্লোবাল ব্যতিক্রম হ্যান্ডলিং / রিপোর্টিং বৈশিষ্ট্য এটি আপনার সফ্টওয়্যারটিতে যুক্ত করে (যদি ইচ্ছা হয়) যা কার্যকর হতে পারে। আমি বিশ্বাস করি এটির একটি কমান্ড-লাইন API রয়েছে যাতে আপনি এটিকে আপনার বিল্ড প্রক্রিয়ার অংশ করতে পারেন।


7

আইএলমার্জ পদ্ধতির বা লার্স হলম জেনসেনের অ্যাসেমব্লিলি রিসলভ ইভেন্টটি পরিচালনা করে না কোনও প্লাগইন হোস্টের পক্ষে কাজ করবে। এক্সিকিউটেবল এইচ বলুন গতিশীলভাবে সমাবেশ পি লোড করে এবং একটি পৃথক সমাবেশে সংজ্ঞায়িত ইন্টারফেস আইপি এর মাধ্যমে এটি অ্যাক্সেস করে । করতে এম্বেড আইপি মধ্যে এইচ এক লার্স এর কোড একটু পরিমার্জন প্রয়োজন হইবে:

Dictionary<string, Assembly> loaded = new Dictionary<string,Assembly>();
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{   Assembly resAssembly;
    string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");
    dllName = dllName.Replace(".", "_");
    if ( !loaded.ContainsKey( dllName ) )
    {   if (dllName.EndsWith("_resources")) return null;
        System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
        byte[] bytes = (byte[])rm.GetObject(dllName);
        resAssembly = System.Reflection.Assembly.Load(bytes);
        loaded.Add(dllName, resAssembly);
    }
    else
    {   resAssembly = loaded[dllName];  }
    return resAssembly;
};  

একই সমাবেশটি সমাধান করার এবং পুনরায় নতুন উদাহরণ তৈরি করার পরিবর্তে বিদ্যমানটিকে ফিরিয়ে দেওয়ার জন্য বারবার চেষ্টাগুলি পরিচালনা করার কৌশল।

সম্পাদনা: পাছে এটি নষ্ট হয়ে যায়। আপনি এই লাইব্রেরির একটি তালিকা পেতে পারেন:

static HashSet<string> IncludedAssemblies = new HashSet<string>();
string[] resources = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
for(int i = 0; i < resources.Length; i++)
{   IncludedAssemblies.Add(resources[i]);  }

এবং পাস হওয়া সমাবেশের অন্তর্ভুক্ত না হলে কেবল নালায় ফিরে আসুন IncludedAssemblies


মন্তব্য হিসাবে মন্তব্য না করে উত্তর হিসাবে পোস্ট করার জন্য দুঃখিত। অন্যের উত্তরগুলিতে মন্তব্য করার অধিকার আমার নেই।
Ant_222

5

.NET কোর 3.0 স্থানীয়ভাবে একটি একক .exe সংকলন সমর্থন করে

বৈশিষ্ট্যটি আপনার প্রকল্প ফাইল (.csproj) এ নিম্নলিখিত সম্পত্তি ব্যবহার করে সক্ষম করা হয়েছে:

    <PropertyGroup>
        <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

এটি কোনও বাহ্যিক সরঞ্জাম ছাড়াই সম্পন্ন করা হয়।

আরও তথ্যের জন্য এই প্রশ্নের জন্য আমার উত্তর দেখুন ।


3

এটি সরল মনে হতে পারে তবে উইনআর একটি স্ব-উত্তোলন সম্পাদনকারীকে একগুচ্ছ ফাইল সংকোচনের বিকল্প দেয় the
এতে প্রচুর কনফিগারযোগ্য অপশন রয়েছে: চূড়ান্ত আইকন, প্রদত্ত পথে ফাইলগুলি এক্সট্র্যাক্ট, এক্সট্রাকশন করার পরে চালানো ফাইল, এক্সট্রাকশন চলাকালীন পপআপের জন্য কাস্টম লোগো / পাঠ্য, কোনও পপআপ উইন্ডো নেই, লাইসেন্স চুক্তির পাঠ্য ইত্যাদি
কিছু ক্ষেত্রে কার্যকর হতে পারে May ।


উইন্ডোজ নিজেই অনুরূপ একটি সরঞ্জাম যাকে বলা হয় ইক্সপ্রেস। এখানে একটি টিউটোরিয়াল রয়েছে
ইভান ফেরার ভিলা

2

আমি একটি .vbs স্ক্রিপ্ট থেকে ডাকা csc.exe সংকলক ব্যবহার করি।

আপনার xyz.cs স্ক্রিপ্টে, নির্দেশের পরে নিম্নলিখিত লাইনগুলি যুক্ত করুন (আমার উদাহরণটি রেনসি এসএসএইচের জন্য):

using System;
using Renci;//FOR THE SSH
using System.Net;//FOR THE ADDRESS TRANSLATION
using System.Reflection;//FOR THE Assembly

//+ref>"C:\Program Files (x86)\Microsoft\ILMerge\Renci.SshNet.dll"
//+res>"C:\Program Files (x86)\Microsoft\ILMerge\Renci.SshNet.dll"
//+ico>"C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Samples\c_sharp\xmldsig\resources\Traffic.ico"

রেফারেস, রেস এবং আইকো ট্যাগগুলি সিএসসি কমান্ড গঠনের জন্য নীচে .vbs স্ক্রিপ্ট দ্বারা নেওয়া হবে।

তারপরে মেইন এ এসেম্বলি রিসলভার কলার যুক্ত করুন:

public static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    .

... এবং নিজে থেকেই ক্লাসের কোথাও রিসলভার যুক্ত করুন:

    স্ট্যাটিক অ্যাসেম্বলি কারেন্টডোমাইন_অসাধারণের সমাধান করুন (অবজেক্ট প্রেরক, রেজোলিউভেন্ট এন্টারস আর্টস)
    {
        স্ট্রিং রিসোর্সনেম = নতুন এসেম্বলনেম (আরগস.নাম) .নাম + ".ডিল";

        (var স্ট্রিম = এসেম্বলটি.গেটেক্সেকিউটিংঅ্যাস্পাবশন ()। গেটম্যানিফেস্ট রিসোর্সস্ট্রিম (রিসোর্নাম)) ব্যবহার করে
        {
            বাইট [] এসেম্বলিডাটা = নতুন বাইট [স্ট্রিম.লেন্থ];
            স্ট্রিম.এড পড়ুন (এসেম্বলিডাটা, 0, এসেম্বলিডাটা.লাইনথ);
            রিটার্ন এসেম্বলি.লড (এসেম্বলিডেটা);
        }

    }

আমি vs স্ক্রিপ্টটির নাম .cs ফাইলের সাথে মেলে (যেমন ssh.vbs ssh.cs সন্ধান করে); এটি স্ক্রিপ্টটি অসংখ্যবার চালানোকে অনেক সহজ করে তোলে তবে আপনি যদি আমার মতো বোকা না হন তবে জেনেরিক স্ক্রিপ্টটি টানুন এবং ড্রপ থেকে .cs ফাইলটি বেছে নিতে পারে:

    ম্লান নাম_ও, শেল, fso
    সেট করুন ওশেল = ক্রিয়েটওবজেক্ট ("শেল। অ্যাপ্লিকেশন")
    সেট করুন fso = ক্রিয়েটওবজেক্ট ("স্ক্রিপ্টিং.ফাইলসিসটেমবজেক্ট")

    'ভিবিএস স্ক্রিপ্ট নামটি টার্গেট ফাইলের নাম হিসাবে নিন
    '################################################
    নাম_ = বিভক্ত (wscript.ScriptName, "।") (0)

    সি। সি ফাইল থেকে বহিরাগত ডিএলএল এবং আইকন নামগুলি পান
    '################################################# ######
    কনস্ট্যান্ট OPEN_FILE_FOR_READING = 1
    অবজেক্ট ইনপুটফাইল = fso.OpenTextFile সেট করুন (নাম_ & ".cs", 1)

    'কোনও কিছুতে পাঠান RE
    '#############################
    ইনপুটডাটা = বিভক্ত (Iজেপুটফাই.আরে পড়ুন সমস্ত, ভিবি নিউইলাইন)

    ইনপুটডাটাতে প্রতিটি স্ট্র্যাডাটা জন্য

        যদি বামে থাকে (strData, 7) = "// + ref>" তখন 
            csc_references = csc_references & "/ संदर्भ:" & ট্রিম (প্রতিস্থাপন (strData, "// + ref>", "")) এবং ""
        শেষ যদি

        যদি বামে থাকে (strData, 7) = "// + res>" তখন 
            csc_resources = csc_resources & "/ রিসোর্স:" & ট্রিম (প্রতিস্থাপন (strData, "// + res>", "")) এবং ""
        শেষ যদি

        যদি বামে থাকে (strData, 7) = "// + আইকো>" তখন 
            csc_icon = "/ win32icon:" & ছাঁটাই (প্রতিস্থাপন (strData, "// + আইকো>", "")) এবং ""
        শেষ যদি
    পরবর্তী

    objInputFile.Close


    'ফাইলটি কম্পাইল করুন
    '################
    oShell.ShellExecute "সি: \ উইন্ডোজ \ মাইক্রোসফট.নেট \ ফ্রেমওয়ার্ক \ v3.5 \ csc.exe", "/ সতর্কতা: 1 / লক্ষ্য: উদাহরণ" & csc_references & csc_res উত্স & csc_icon & "" & নাম_ & ".cs" , "", "রুনাস", 2


    WScript.Quit (0)

0

সি # তে হাইব্রিড নেটিভ / ম্যানেজড অ্যাসেমব্লিলি তৈরি করা সম্ভব তবে এতটা সহজ নয়। আপনি কি পরিবর্তে সি ++ ব্যবহার করছেন এটি অনেক সহজ হবে, কারণ ভিজ্যুয়াল সি ++ সংকলক সহজেই অন্য যে কোনও কিছু হিসাবে সংকর সমাবেশগুলি তৈরি করতে পারে lies

হাইব্রিড অ্যাসেমবিলি তৈরির জন্য আপনার যদি কঠোর প্রয়োজন না হয় তবে আমি মুসিজেনেসিসের সাথে একমত হই যে সি # এর সাথে করা সমস্যাটি আসলেই উপযুক্ত নয়। আপনার যদি এটি করার দরকার হয় তবে সম্ভবত পরিবর্তে C ++ / CLI এ যাওয়ার দিকে তাকান।


0

আপনি বর্ণনা করছেন এমনভাবে অ্যাসেম্বলি মার্জটি সম্পাদন করতে সাধারণত আপনার কিছু বিল্ড সরঞ্জামের প্রয়োজন হবে। এজাজফেসেটর (eazfuscator.blogspot.com/) নামে একটি নিখরচায় সরঞ্জাম রয়েছে যা বাইটকোড ম্যাঙ্গিলিংয়ের জন্য ডিজাইন করা হয়েছে যা সমাবেশ সমাবেশকে পরিচালনা করে। আপনি আপনার সমাবেশগুলি মার্জ করার জন্য ভিজ্যুয়াল স্টুডিও সহ একটি পোস্ট বিল্ড কমান্ড লাইনে এটি যুক্ত করতে পারেন, তবে কোনও মাইক্রোসফট সংযোজনীয় পরিস্থিতিতে কোনও অবিচ্ছিন্ন সমাবেশে উত্থাপিত সমস্যার কারণে আপনার মাইলেজটি পৃথক হবে।

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

এছাড়াও অনেকগুলি ভিজ্যুয়াল স্টুডিও প্লাগইন রয়েছে যা অ্যাপ্লিকেশনটি তৈরির অংশ হিসাবে অ্যাসেম্বলি মার্জিং সম্পাদন করবে।

বিকল্প হিসাবে যদি আপনার এটি স্বয়ংক্রিয়ভাবে সম্পন্ন করার প্রয়োজন না হয় তবে ILMerge এর মতো অনেকগুলি সরঞ্জাম রয়েছে যা। নেট অ্যাসেমব্লিকে একক ফাইলে মার্জ করবে will

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


1
ইজফুসেক্টর কেবল ইলমার্জ, এএফআইকে কল করবে।
ববি

+1 ববি। আমার এটা মনে রাখা উচিত ছিল। আপনার জন্য যে সমস্ত ইজফুকেটর করে সে সম্পর্কে আরও সাধারণ কনফিগারেশন ফাইলের সাহায্যে আইএলমার্গের আসল কলগুলি বিমূর্ত করা হয়।
wllmsaccnt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.