আপনার একটি ভাল প্রশ্ন আছে। আপনার সমাধান সহ সম্ভবত কিছু বাণিজ্য বন্ধ রয়েছে। চূড়ান্ত উত্তরটি আসলে প্ল্যাটফর্ম নির্ভর বলতে আপনার বোঝার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি বাহ্যিক অ্যাপ্লিকেশনগুলি শুরু করার জন্য কোনও প্রক্রিয়া শুরু করেন এবং আপনি কেবল একটি অ্যাপ্লিকেশন এবং অন্যটির মধ্যে স্যুইচ করছেন তবে আপনি সম্ভবত খুব বেশি জটিলতা ছাড়াই এটি পরিচালনা করতে পারেন handle আপনি যদি নেটিভ লাইব্রেরিগুলির সাথে পি / ইনভোক করার কথা বলছেন তবে আরও কিছু করার দরকার আছে। তবে আপনি যদি কেবলমাত্র একটি প্ল্যাটফর্মে উপস্থিত লাইব্রেরিগুলির সাথে সংযোগ স্থাপন করেন তবে আপনার সম্ভবত একাধিক অ্যাসেম্বলি ব্যবহার করা প্রয়োজন।
বাহ্যিক অ্যাপস
#if
এই পরিস্থিতিতে আপনার সম্ভবত বিবৃতি ব্যবহারের প্রয়োজন হবে না । কিছু ইন্টারফেস সেট আপ করুন এবং প্ল্যাটফর্মের জন্য একটি বাস্তবায়ন করুন। প্ল্যাটফর্মটি সনাক্ত করতে এবং সঠিক উদাহরণ সরবরাহ করতে একটি কারখানা ব্যবহার করুন।
কিছু ক্ষেত্রে এটি নির্দিষ্ট প্ল্যাটফর্মের জন্য কেবল বাইনারি সংকলিত হয় তবে এক্সিকিউটেবলের নাম এবং সমস্ত পরামিতি একইরূপে সংজ্ঞায়িত হয়। সেক্ষেত্রে এটি সঠিক সম্পাদনযোগ্যকে সমাধান করার বিষয়। উইন্ডোজ এবং লিনাক্স জুড়ে চলতে পারে এমন একটি বাল্ক অডিও রূপান্তরকারী অ্যাপের জন্য আমার কাছে বাইনারি নামটি সমাধান করার একটি স্ট্যাটিক ইনিশিয়ালাইজার ছিল।
public class AudioProcessor
{
private static readonly string AppName = "lame";
private static readonly string FullAppPath;
static AudioProcessor()
{
var platform = DetectPlatform();
var architecture = Detect64or32Bits();
FullAppPath = Path.combine(platform, architecture, AppName);
}
}
কিছুই এখানে অভিনব। শুধু ভাল ওল 'ফ্যাশন ক্লাস।
পি / ডাকা
পি / ইনভোকে কিছুটা কৌশলযুক্ত। নীচের লাইনটি হ'ল দেশীয় লাইব্রেরির সঠিক সংস্করণটি লোড হয়েছে তা আপনার নিশ্চিত করা দরকার। উইন্ডোতে আপনি পি / ইনভোক করবেন SetDllDirectory()
। বিভিন্ন প্ল্যাটফর্মের জন্য এই পদক্ষেপের প্রয়োজন হতে পারে না। সুতরাং এখানেই জিনিসগুলি অগোছালো হতে পারে। #if
আপনার গ্রন্থাগারের পাথটি সমাধান করার জন্য কোন কলটি ব্যবহৃত হয় তা নিয়ন্ত্রণ করতে আপনার বিবৃতিগুলি ব্যবহার করতে হতে পারে - বিশেষত যদি আপনি এটি আপনার বিতরণ প্যাকেজে অন্তর্ভুক্ত করছেন।
সম্পূর্ণ ভিন্ন প্ল্যাটফর্ম নির্ভর গ্রন্থাগারগুলির সাথে সংযোগ স্থাপন
পুরানো স্কুল মাল্টি-টার্গেটিং পদ্ধতির এখানে দরকারী হতে পারে। তবে এটি প্রচুর কদর্যতা নিয়ে আসে। যে দিনগুলিতে কিছু প্রকল্পগুলি একই ডিএলএল লক্ষ্য সিলভারলাইট, ডাব্লুপিএফ এবং সম্ভাব্য ইউএপি রাখার চেষ্টা করেছিল, আপনাকে বিভিন্ন সংকলন ট্যাগ সহ একাধিকবার অ্যাপ্লিকেশনটি সংকলন করতে হবে। উপরের প্রতিটি প্ল্যাটফর্মের সাথে চ্যালেঞ্জ হ'ল তারা একই ধারণাটি ভাগ করে নেওয়ার সময়, প্ল্যাটফর্মগুলি যথেষ্ট আলাদা যে আপনাকে এই পার্থক্যগুলি ঘিরে কাজ করতে হবে। এখান থেকেই আমরা জাহান্নামে .ুকি #if
।
.csproj
প্ল্যাটফর্ম নির্ভর নির্ভর রেফারেন্সগুলি হ্যান্ডেল করার জন্য এই পদ্ধতির জন্য ফাইল সম্পাদনাও করা দরকার । যেহেতু আপনার .csproj
ফাইলটি একটি এমএসবিল্ড ফাইল তাই এটি একটি জ্ঞাত এবং অনুমানযোগ্য পদ্ধতিতে করা সম্পূর্ণ সম্ভব।
# নরক
আপনি #if
বিবৃতি ব্যবহার করে কোডের বিভাগগুলি চালু বা বন্ধ করতে পারেন যাতে এটি অ্যাপ্লিকেশনগুলির মধ্যে সামান্য পার্থক্য পরিচালনা করতে কার্যকর হয়। পৃষ্ঠতল এটি একটি ভাল ধারণা মত শোনাচ্ছে। এমনকি অঙ্কন কোডটি ডিবাগ করতে বাউন্ডিং বক্স ভিজ্যুয়ালাইজেশন চালু এবং বন্ধ করার উপায় হিসাবেও আমি এটি ব্যবহার করেছি।
সঙ্গে 1 নম্বর সমস্যা #if
যে কেউ যে কোডটি বন্ধ পরিণত হয় পার্সার দ্বারা মূল্যায়ন করা হয়। আপনার লাইব্রেরিটি পুনরায় কম্পাইল করার অপেক্ষায় আপনার সুপ্ত বাক্য গঠন ত্রুটি বা আরও খারাপ লজিক ত্রুটি থাকতে পারে। এটি রিফ্যাক্টরিং কোডটি আরও বেশি সমস্যাযুক্ত হয়ে ওঠে। কোনও পদ্ধতির নাম পরিবর্তন করা বা প্যারামিটারের ক্রম পরিবর্তন করার মতো সাধারণ কিছু ঠিকঠাকভাবে পরিচালনা করা হবে তবে পার্সার কখনই #if
বিবৃতি দ্বারা বন্ধ হওয়া কোনও কিছুর মূল্যায়ন করে না কারণ হঠাৎ আপনার কোডটি ভঙ্গ হয়ে গেছে যা আপনি পুনরায় সংকলন না করা পর্যন্ত দেখতে পাবেন না।
আমার সমস্ত ডিবাগ কোড যা সেভাবে লেখা হয়েছিল সেগুলি আবার সিরিজ রিফ্যাক্টরিংগুলি ভেঙে আবার লিখতে হয়েছিল। পুনর্লিখনের সময়, আমি এই বৈশিষ্ট্যগুলি চালু এবং বন্ধ করতে একটি বিশ্বব্যাপী কনফিগার ক্লাস ব্যবহার করেছি। এটি এটিকে রিফ্যাক্টর সরঞ্জাম প্রমাণ হিসাবে তৈরি করেছে, কিন্তু যখন এপিআই সম্পূর্ণ আলাদা হয় তখন এ জাতীয় সমাধান সহায়তা করে না।
আমার পছন্দের পদ্ধতি
আমার পছন্দের পদ্ধতিটি শিখে নেওয়া অনেক বেদনাদায়ক পাঠের উপর ভিত্তি করে এবং মাইক্রোসফ্টের নিজস্ব উদাহরণের ভিত্তিতেও একাধিক অ্যাসেম্বলি ব্যবহার করা।
একটি মূল নেটস্ট্যান্ডার্ড সমাবেশে সমস্ত ইন্টারফেস সংজ্ঞায়িত করা হবে এবং সমস্ত সাধারণ কোড থাকবে। প্ল্যাটফর্ম নির্ভর বাস্তবায়নগুলি একটি পৃথক সমাবেশে অন্তর্ভুক্ত থাকবে যখন বৈশিষ্ট্যগুলি যুক্ত করবে add
এই পদ্ধতির নতুন কনফিগারেশন এপিআই এবং বর্তমান পরিচয় আর্কিটেকচার দ্বারা অনুকরণীয় mp আপনার আরও নির্দিষ্ট সংহতকরণগুলির দরকার হওয়ায় আপনি কেবল নতুন নতুন সমাবেশগুলি যুক্ত করুন। এই অ্যাসেমস্লিগুলি আপনার সেট আপে নিজেকে অন্তর্ভুক্ত করতে এক্সটেনশন ফাংশন সরবরাহ করে। আপনি যদি নির্ভরতা ইনজেকশন পদ্ধতির ব্যবহার করে থাকেন তবে extension এক্সটেনশন পদ্ধতিগুলি লাইব্রেরিকে তার পরিষেবাগুলি নিবন্ধ করার অনুমতি দেয়।
এটি হ'ল #if
জাহান্নাম এড়াতে এবং যথেষ্ট ভিন্ন পরিবেশকে সন্তুষ্ট করার একমাত্র উপায় সম্পর্কে আমি জানি ।