প্ল্যাটফর্ম নির্ভর রেফারেন্স সহ উইন্ডোজ এবং ম্যাকের জন্য নেট নেট লাইব্রেরি করার কোনও উপায় আছে কি?


12

আমরা সি # ব্যবহার করে ডেস্কটপগুলির জন্য উইন্ডোজ এবং ম্যাকের একটি ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশন বিকাশের চেষ্টা করছি। অ্যাপ্লিকেশনটিতে প্রচুর পরিমাণে প্ল্যাটফর্ম নির্ভর স্টাফ রয়েছে এবং আমাদের দলের নেতৃত্ব আমাদের সি # তে সমস্ত কোড লিখতে চায়। এটি করার সহজ উপায় হ'ল সি ++ এ মোড়ক লিখুন এবং কেবলমাত্র # # কোডের লাইব্রেরিগুলি উল্লেখ করুন এবং সি ++ লাইব্রেরিগুলিকে প্ল্যাটফর্মের জিনিসগুলি মোকাবেলা করা উচিত ... হায় হায়, এটি হ'ল না।

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

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

যদি আমার অবশ্যই হয়, একটি একক প্রকল্প যা আমাকে দুটি বাস্তবায়ন লেখার অনুমতি দেবে তা করতে হবে। আমি ম্যাকের জন্য ভিজ্যুয়াল স্টুডিওতে একটি লাইব্রেরি প্রকল্প তৈরি করার কোনও উপায় খুঁজে পাইনি , তবে এটি আমাকে তা করতে দেয়। একমাত্র প্রজেক্ট যা একাধিক বাস্তবায়নের অনুমতি দেবে বলে মনে হয় এটি বাস্তবায়নগুলি আইওএস বা অ্যান্ড্রয়েডের জন্য are


কোন। নেট রানটাইম আপনি ব্যবহার করতে যাচ্ছেন?
ইউফোরিক

2
জামারিনও তেমন কিছু করেন। বিল্ড কনফিগার সাথে থাকতে পারে?
ইভান

2
ম্যাকের জন্য ভিজ্যুয়াল স্টুডিওটি সত্যই ভিজ্যুয়াল স্টুডিওতে আগ্রহী নয়, এটি কেবল একটি রেবেডেড জামারিন স্টুডিও। জ্যামারিন ডক্সে কিছু থাকতে পারে?
richzilla

3
সেরা পন্থাটি বিভিন্ন সমাবেশ হতে চলেছে ... ইন্টারফেস এবং সাধারণ কোডের জন্য একটি এবং লক্ষ্য প্ল্যাটফর্মের জন্য প্রতিটি একটি। যাইহোক, আপনি বহু-লক্ষ্যবস্তু করতে পারেন এবং প্রয়োগগুলি অদলবদল করতে #if বিবৃতি ব্যবহার করতে পারেন। খারাপ দিকটি হ'ল সক্ষম নয় এমন যে কোনও কিছুই মূল্যায়ন করা হয় না তাই এটি সহজেই তারিখের বাইরে চলে যেতে পারে।
বেরিন লরিটস

আপনি যখন প্ল্যাটফর্ম নির্ভর রেফারেন্স বলছেন, আপনি কি দেশীয় কোড বা সমস্ত সি # কোডের কথা বলছেন?
বেরিন লরিটস

উত্তর:


4

আপনার একটি ভাল প্রশ্ন আছে। আপনার সমাধান সহ সম্ভবত কিছু বাণিজ্য বন্ধ রয়েছে। চূড়ান্ত উত্তরটি আসলে প্ল্যাটফর্ম নির্ভর বলতে আপনার বোঝার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি বাহ্যিক অ্যাপ্লিকেশনগুলি শুরু করার জন্য কোনও প্রক্রিয়া শুরু করেন এবং আপনি কেবল একটি অ্যাপ্লিকেশন এবং অন্যটির মধ্যে স্যুইচ করছেন তবে আপনি সম্ভবত খুব বেশি জটিলতা ছাড়াই এটি পরিচালনা করতে পারেন 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জাহান্নাম এড়াতে এবং যথেষ্ট ভিন্ন পরিবেশকে সন্তুষ্ট করার একমাত্র উপায় সম্পর্কে আমি জানি ।


আমি সি # তে স্তন্যপান করি (প্রায় 18 বছর ধরে সি ++ এবং আধা দিনের জন্য সি # ব্যবহার করা হয়েছিল, এটি আশা করা যায়)। এই নতুন কনফিগারেশন এপিআই ... আপনি কি এর সাথে কিছু লিঙ্ক সরবরাহ করতে পারেন। আমি নিজের থেকে এটি খুঁজে পাচ্ছি না।
ক্লিয়ারার

2
ডকস.মাইক্রোসফট.ইন- ইউএস / এস্পনেট / স্কোর / ফান্ডামেন্টালস / কনফিগারেশন/… অতিরিক্ত কনফিগারেশন উত্স যুক্ত করতে একাধিক নুগেট প্যাকেজ রয়েছে। উদাহরণস্বরূপ, এনভায়রনমেন্ট ভেরিয়েবল,
জেএসএন

1
এটি Microsoft.Extensions.Configurationএপিআই এর সেট।
বারিন লরিটস

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