.net - with - visual studio code




কিভাবে আমি ভিসুয়াল স্টুডিও কম্পাইল ত্রুটি, "প্রসেসর আর্কিটেকচারের মধ্যে দ্বন্দ্ব" ঠিক করব? (12)

সি # DLL প্ল্যাটফর্ম টার্গেট x86 দিয়ে সেট আপ করা হয়

কোন সমস্যাটি হল, কোনও DLL প্রকৃতপক্ষে প্রক্রিয়াটির প্রত্যক্ষদর্শীকে বেছে নেবে না। এটি সম্পূর্ণরূপে এক্সই প্রকল্পের দ্বারা নির্ধারিত হয়, এটি লোড হওয়া প্রথম সমাবেশ যা তার প্ল্যাটফর্ম লক্ষ্য সেটিংটি যা গণনা করে এবং প্রক্রিয়ার জন্য প্রত্যক্ষদর্শী সেট করে।

ডিএলএলগুলির কোন বিকল্প নেই, তাদের প্রক্রিয়াধীনতার সাথে সামঞ্জস্যপূর্ণ হতে হবে। যদি তারা না হয় তবে আপনার কোডটি তাদের ব্যবহার করার চেষ্টা করলে BadImageFormatException এর সাথে একটি বড় Kaboom পাবেন।

সুতরাং DLL এর জন্য একটি ভাল নির্বাচন হল AnyCPU যাতে তারা কোনভাবে কাজ করে। যে সি # DLLs জন্য অনেক জ্ঞান করে তোলে, তারা উভয় উপায় কাজ করে। কিন্তু নিশ্চিত, আপনার সি ++ / সিএলআই মিশ্র মোড DLL নয়, এটির মধ্যে এমন পরিচালিত কোড রয়েছে যা শুধুমাত্র 32-বিট মোডে চললেই ভাল কাজ করতে পারে। আপনি যে সম্পর্কে সতর্কতা উৎপন্ন নির্মাণ সিস্টেম পেতে পারেন । যা আপনি পেয়েছিলাম ঠিক কি। শুধু সতর্কতা, এটি এখনও সঠিকভাবে তৈরি করে।

শুধু সমস্যা প্যান্ট। X86 এ EXE প্রজেক্টের প্ল্যাটফর্ম টার্গেটটি সেট করুন, এটি অন্য কোন সেটিংসের সাথে কাজ করবে না। এবং যেকোনো সিপিএল প্রকল্পগুলিতে AnyCPU এ রাখুন।

আমি ভিজ্যুয়াল স্টুডিও ২010-এ প্রকল্প কনফিগারেশনের জন্য নতুন, কিন্তু আমি কিছু research করেছি এবং এখনও এই সমস্যাটির সমাধান করতে পারছি না। আমার সি সি ++ DLL সহ একটি ভিজ্যুয়াল স্টুডিও সমাধান রয়েছে যা C # DLL উল্লেখ করে। সি # DLL কিছু অন্যান্য DLL উল্লেখ করে, কিছু আমার প্রকল্পের মধ্যে এবং কিছু বাহ্যিক। যখন আমি সি ++ DLL কম্পাইল করার চেষ্টা করি, তখন আমি এই সতর্কতাটি পাই:

সতর্কতা MSB3270: "MSIL" এবং "[অভ্যন্তরীণ C # DL]]", "x86" রেফারেন্সের প্রসেসর আর্কিটেকচার নির্মাণের প্রসেসর আর্কিটেকচারের মধ্যে একটি দ্বন্দ্ব ছিল।

এটি আমার আর্কিটেকচারগুলি সারিবদ্ধ করতে কনফিগারেশন ম্যানেজারে যেতে আমাকে বলে। সি # DLL প্ল্যাটফর্ম টার্গেট x86 দিয়ে সেট আপ করা হয়। যদি আমি অন্য কিছুতে এটি পরিবর্তন করার চেষ্টা করি, যেমন কোনও সিপিপি, এটি অভিযোগ করে কারণ বহিরাগত DLL এটির উপর নির্ভর করে এটির প্ল্যাটফর্ম টার্গেট x86 রয়েছে।

যখন আমি কনফিগারেশন ম্যানেজারটি দেখি তখন এটি আমার সি # DLL x86 হিসাবে প্ল্যাটফর্ম এবং আমার সি ++ প্রকল্পের জন্য Win32 হিসাবে দেখায়। এই সঠিক সেটআপ মত মনে হয়; অবশ্যই আমি আমার সি ++ প্রকল্পটির জন্য প্ল্যাটফর্ম সেট x64 তে প্রজেক্টটি চাই না, যা অন্য একমাত্র বিকল্প উপস্থাপন করে।

আমি এখানে কি ভুল করছি?


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

আমি তারপর রেফারেন্স প্রকল্পের csproj লাগছিল এবং এই পাওয়া:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>

একরকম এই PlatformTarget একটি কনফিগ পরিবর্তন মাঝখানে যোগ করা হয়েছে এবং আইডিই এটি দেখতে বলে মনে হচ্ছে না।

রেফারেন্স প্রকল্পের থেকে এই লাইন অপসারণ আমার সমস্যা সমাধান।


আমার আগেও একই রকম সমস্যা হয়েছে, বিশেষ করে যখন একটি বিদ্যমান x64 সমাধান, যেমন SharePoint এর একটি সমাধান সমাধান যোগ করা। আমার ক্ষেত্রে, মনে হচ্ছে যে নির্দিষ্ট প্রকল্প টেমপ্লেট ডিফল্টরূপে কিছু প্ল্যাটফর্ম হিসাবে যোগ করা হয়েছে।

এখানে সমাধানটি প্রায়শই আমার জন্য কাজ করে: কনফিগারেশন ম্যানেজারের সঠিক প্ল্যাটফর্মে সবকিছু ঠিক করুন (সক্রিয় কনফিগারেশন ড্রপ-ডাউন, ডাবগ সাধারণত এটি পাওয়ার জন্য একটি ভাল উপায়) এবং প্রকল্প প্ল্যাটফর্ম (প্রকল্প বৈশিষ্ট্যে) নির্মাণ, তারপর AnyCPU সবকিছু ফিরে সেট। কখনও কখনও আমাকে কিছু নির্ভরতা (প্রতিটি প্রজেক্টের প্রোপার্টিগুলিতে DLL) সরিয়ে এবং পুনরায় যোগ করতে হয় এবং কখনও কখনও "32 বিট বা 64 বিট প্রক্রিয়াতে পরীক্ষা চালান" (স্থানীয়.testsettings এ ডবল ক্লিক করুন এবং হোস্টগুলিতে যান) পরিবর্তন করতে হবে।

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


আমার প্রকল্পের জন্য, আমার x86 এবং x64 উভয়ই তৈরি করতে সক্ষম হওয়া দরকার। এর সাথে সমস্যা হল যে যখনই আপনি যখন ব্যবহার করেন তখন রেফারেন্স যুক্ত করুন, তখন অন্যটি তৈরি করার সময় এটি অভিযোগ করে।

আমার সমাধান ম্যানুয়ালি * .csproj ফাইলগুলি সম্পাদনা করতে হয় যাতে লাইনগুলি এই রকম হয়:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64"/>

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"/>

এই পরিবর্তন করুন:

<Reference Include="MyLibrary.MyNamespace, Version=1.0.0.0, Culture=neutral"/>

আমি SQLite খোলার সংযোগের সাথে একই সমস্যা ছিল, এবং Nuget ব্যবহার করে এবং প্রকল্প (SQLite) ব্যবহৃত উপাদান ইনস্টল এটি ইনস্টল! এই ভাবে আপনার কম্পোনেন্ট ইনস্টল করার চেষ্টা করুন এবং ফলাফল চেক করুন


আমি আমার বিল্ড একটি খুব অনুরূপ সতর্কতা ছিল। আমার প্রকল্পগুলি নেটওয়ার্কে 4.5 নেটওয়ার্কে সেট করা হয়েছিল, বিল্ড সার্ভারে উইন্ডোজ 8.1 এসডিকে (.NET 4.5.1 এর জন্য) ইনস্টল করা হয়েছিল। .NET 4.5.1 লক্ষ্য করার জন্য আমার প্রকল্প আপডেট করার পরে (আমার জন্য কোন সমস্যা ছিল না, সম্পূর্ণ নতুন অ্যাপ্লিকেশনের জন্য ছিল), আমি আর সতর্কতা পাইনি ...


আমি এই সতর্কতাটি সমাধান করতে "কনফিগারেশন ম্যানেজার" পরিবর্তন (মিশ্র প্লাটফর্ম) সমাধান করেছি।


এই সতর্কতাটি নতুন ভিজ্যুয়াল স্টুডিও 11 বিটা এবং .NET 4.5 এর সাথে উপস্থাপিত হয়েছে বলে মনে হচ্ছে, যদিও আমার মনে হয় এটি আগে সম্ভব হয়েছে।

প্রথম, এটি সত্যিই একটি সতর্কবার্তা। আপনি শুধু x86 নির্ভরতাগুলির সাথে আচরণ করলে এটি কোনও ক্ষতি করতে পারে না। মাইক্রোসফ্ট যখন আপনি বলে যে আপনার প্রকল্পটি "কোনও CPU" এর সাথে সামঞ্জস্যপূর্ণ তখনই আপনাকে সতর্ক করার চেষ্টা করছে তবে আপনার একটি প্রকল্প বা। ডিএল সমাবেশে নির্ভরতা রয়েছে যা x86 বা x64। কারন আপনার একটি x86 নির্ভরতা রয়েছে, তাই টেকনিক্যালি আপনার প্রকল্পটি "কোনও CPU" সামঞ্জস্যপূর্ণ নয়। সতর্কতা অবলম্বন করতে, আপনাকে অবশ্যই "যেকোনো CPU" থেকে "x86" এ আপনার প্রকল্পটি পরিবর্তন করতে হবে। এটি করা খুব সহজ, এখানে পদক্ষেপগুলি।

  1. বিল্ড | কনফিগারেশন ম্যানেজার মেনু আইটেম এ যান।
  2. প্ল্যাটফর্মের অধীনে আপনার প্রোজেক্টটিকে খুঁজুন, এটি "কোনও CPU" বলে
  3. ড্রপ ডাউন থেকে "Any CPU" বিকল্পটি নির্বাচন করুন এবং তারপরে <New..> নির্বাচন <New..>
  4. যে কথোপকথন থেকে, "নতুন প্ল্যাটফর্ম" ড্রপ ডাউন থেকে x86 নির্বাচন করুন এবং নিশ্চিত করুন যে "যেকোন CPU" "ড্রপ সেটিংস" ড্রপ ডাউন থেকে নির্বাচিত হয়েছে।
  5. ঠিক আছে আঘাত
  6. আপনি ডিবাগ এবং রিলিজ কনফিগারেশন উভয় জন্য x86 নির্বাচন করতে চান।

এটি সতর্কতা অবলম্বন করবে এবং আপনার সমাবেশ বা প্রকল্পটি আর "কোনও CPU" সামঞ্জস্যপূর্ণ নয় তবে এখন x86 নির্দিষ্ট থাকবে। এটি 6464 বিট প্রজেক্ট নির্মাণের ক্ষেত্রেও প্রযোজ্য, যার একটি x64 নির্ভরতা রয়েছে; আপনি শুধু পরিবর্তে x64 নির্বাচন করবে।

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


এটি একটি খুব জঘন্য সতর্কতা এবং এটি একটি বৈধ সতর্কতা যদিও এটি তৃতীয় পক্ষের উপাদান এবং অন্যান্য কারণে ব্যবহার করার কারণে এটি সমাধান করা যাবে না এমন কিছু ক্ষেত্রে রয়েছে। সতর্কতা ছাড়াও আমারও একই সমস্যা রয়েছে কারণ আমার প্রকল্প প্ল্যাটফর্মটি AnyCPU এবং আমি AMD64 এর জন্য নির্মিত একটি এমএস লাইব্রেরি উল্লেখ করছি। এটি ভিজ্যুয়াল স্টুডিও ২010 এর মাধ্যমে, এবং VS2012 এবং .NET 4.5 ইনস্টল করে প্রবর্তিত হয় বলে মনে হচ্ছে।

যেহেতু আমি এমএস লাইব্রেরী পরিবর্তন করতে পারছি না তাই আমি রেফারেন্স করছি, এবং যেহেতু আমি জানি যে আমার টার্গেট স্থাপনার পরিবেশ শুধুমাত্র 64-বিট হবে, আমি নিরাপদে এই সমস্যাটি উপেক্ষা করতে পারি।

সতর্কতা সম্পর্কে কি? মাইক্রোসফ্ট একটি কানেক্ট রিপোর্টের প্রতিক্রিয়া পোস্ট করেছে যে এক বিকল্পটি সেই সতর্কতাটি নিষ্ক্রিয় করা। আপনাকে কেবলমাত্র এটিই করা উচিত যে আপনি আপনার সমাধান আর্কিটেকচার সম্পর্কে খুব সচেতন এবং আপনি আপনার স্থাপনার লক্ষ্য সম্পূর্ণরূপে বুঝতে পেরেছেন এবং জানেন যে এটি সত্যিই উন্নয়ন পরিবেশের বাইরে একটি সমস্যা নয়।

আপনি আপনার প্রকল্প ফাইল সম্পাদনা করতে এবং সতর্কতাটি অক্ষম করতে এই সম্পত্তি গোষ্ঠী এবং সেটিংটি যুক্ত করতে পারেন:

<PropertyGroup>
  <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>

এমএস ইউনিট টেস্ট DLL এর কারণে এটি আমার একই সমস্যা ছিল। আমার WPF অ্যাপ্লিকেশন x86 হিসাবে একত্রিত হয়েছিল কিন্তু ইউনিট পরীক্ষা DLL (রেফারেন্স করা EXE ফাইল) "কোনও CPU" হিসাবে। আমি x86 (EXE হিসাবে একই) জন্য কম্পাইল করা ইউনিট পরীক্ষা DLL পরিবর্তন করেছি এবং এটি পুনঃস্থাপিত হয়েছিল।


থাম্ব একটি ভাল নিয়ম "খোলা DLLs, বন্ধ EXEs", যা হল:

  • EXE x86 বা x64 উল্লেখ করে ওএসকে লক্ষ্য করে।
  • DLL খোলা থাকে (অর্থাৎ, AnyCPU) যাতে 32-বিট বা 64-বিট প্রক্রিয়ার মধ্যে তা তাত্ক্ষণিকভাবে চালু করা যায়।

আপনি যখন কোনও সিএসপিইউ হিসাবে একটি এক্সই তৈরি করেন, তখন আপনি যা করছেন তা হ'ল OSD- এ কী ব্যবহার করতে হবে তার সিদ্ধান্তটি বাতিল করছে, যা ইএইইইটিটিকে তার পছন্দ অনুসারে জিট করবে। অর্থাৎ, একটি x64 OS 64-বিট প্রক্রিয়া তৈরি করবে, একটি x86 OS একটি 32-বিট প্রক্রিয়া তৈরি করবে।

AnyCPU হিসাবে DLL বিল্ডিং প্রক্রিয়া তাদের উভয় সামঞ্জস্যপূর্ণ করে তোলে।

সমাবেশ লোডিং এর subtleties উপর আরো জন্য, here । নির্বাহী সারাংশ ভালো কিছু পড়তে:

  • AnyCPU - এক্সকোজিং প্রক্রিয়া উপর নির্ভর করে x64 বা x86 সমাবেশ হিসাবে লোড
  • x86 - x86 সমাবেশ হিসাবে লোড; একটি x64 প্রক্রিয়া থেকে লোড হবে না
  • x64 - x64 সমাবেশ হিসাবে লোড; একটি x86 প্রক্রিয়া থেকে লোড হবে না

যদি আপনার C # DLL এর x86- ভিত্তিক নির্ভরতা থাকে তবে আপনার DLL নিজেই x86 হতে হবে। আমি সত্যিই যে প্রায় একটি উপায় দেখতে না। VS এটিকে পরিবর্তন করার জন্য অভিযোগ (উদাহরণস্বরূপ) x64 কারণ 64-বিট এক্সিকিউটেবল 32-বিট লাইব্রেরি লোড করতে পারে না।

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

আমি আপনাকে সম্মানজনকভাবে প্রকল্পগুলির সঠিক কনফিগারেশন এবং কিভাবে তারা আন্তঃ-সম্পর্কিত হয় তার আরো কিছু বিস্তারিত পর্যালোচনা এবং পোস্ট করতে চাইতে পারি? সম্ভব হলে আরো সাহায্য খুশি।





visual-studio