কীভাবে বন্ধু সমাবেশ ঘোষণা করবেন?


114

আমার সমাধানে আমার 2 টি প্রকল্প রয়েছে:

  1. সমাবেশ (বেসিক লাইব্রেরি)
  2. পরীক্ষা সমাবেশ (নুনিট)

আমি প্রথম প্রকল্পে টেস্ট অ্যাসেমব্লিকে ফ্রেন্ডস অ্যাসেমব্লী হিসাবে ঘোষণা করেছিলাম:

[assembly: InternalsVisibleTo ("Company.Product.Tests")]

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

বন্ধুত্বপূর্ণ সমাবেশের রেফারেন্স 'Company.Product.T পরীক্ষা' অবৈধ। শক্ত-স্বাক্ষরিত অ্যাসেমব্লিগুলিকে অবশ্যই তাদের অভ্যন্তরীণ ভিজিবলটো ঘোষণায় একটি সর্বজনীন কী নির্দিষ্ট করতে হবে।

আমি এসএনই ইউটিলিটি ব্যবহার করে আমার স্ন্যাক ফাইল থেকে সর্বজনীন কীটি বের করার চেষ্টা করেছি তবে এটি একটি তারযুক্ত বাইনারি ফাইল উত্পন্ন করে যা আমি কীভাবে ব্যবহার করব তা নিশ্চিত। আমি কীভাবে সমস্যাটি সমাধান করতে পারি?

উত্তর:


194

আপনাকে উভয় অ্যাসেম্বলিতে স্বাক্ষর করতে হবে , কারণ কার্যকরভাবে উভয় সমাবেশই একে অপরকে রেফারেন্স করে।

আপনাকে ইন্টার্নালভিজিবলটো বৈশিষ্ট্যে সর্বজনীন কী রাখতে হবে। উদাহরণস্বরূপ, প্রোটোকল বাফারগুলিতে আমি ব্যবহার করি:

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

সর্বজনীন কী চালিয়ে পুনরুদ্ধার করা হয়

sn -Tp path\to\test\assembly.dll

বিকল্পভাবে, .snk ফাইল থেকে এটি পান:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk

7
এবং এমএসডিএন ডকুমেন্টেশন (এমএসডিএন.মাইক্রোসফটকম / en-us / library/… ) হাস্যকরভাবে সংক্ষিপ্ত পাবলিক কী উল্লেখ করা আমার কাছে বিরক্তিজনক, যা প্রায় আমার কাছে পাবলিক কী টোকেনের মতো দেখাচ্ছে ।
হেমন্ত

3
আপনি .snk ফাইল থেকে সরাসরি পাবলিক কীটি বের করতে পারেন: sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pk //
টিম লং

1
আমি নির্দিষ্ট করা 'এসেম্বলি শিরোনাম' ব্যবহার করছিলাম AssemblyInfo.cs। তার পর থেকে সঠিক নামটি ব্যবহার করার জন্য প্রকল্পের সম্পত্তি / অ্যাপ্লিকেশন ডায়ালগের (সমাবেশের নাম) যা ভিজ্যুয়াল স্টুডিওর সমাধান এক্সপ্লোরারটিতে প্রকল্পের নাম থেকে আবার পৃথক) ded
কর্নেল আতঙ্ক

7
এই উত্তরগুলি এবং মতামত যেমন সহায়ক হয়েছে তেমনি বুঝতে আমার কিছু পরীক্ষা-নিরীক্ষার প্রয়োজন ছিল যে পরীক্ষাগুলি সম্বলিত সমাবেশ থেকে পাবলিক কী হ'ল 'ইন্টারনালআইএনভিজিবলটো' ঘোষণা সম্বলিত সমাবেশ নয়।
Andreas

3
@ আন্ড্রেয়াস: ঠিক যে নামটি আপনি নাম দিয়ে আসছেন তার সাথে এটিও যায় - আপনি যে সমাবেশটি আস্থা রাখছেন তার মধ্যে আপনি বিশ্বাসের জন্য সমাবেশের শক্তিশালী নামটি নির্দিষ্ট করে দিচ্ছেন।
জন স্কিটি

-3

আপনি sn.exe এর সাথে যাদু ছাড়াই আপনার পছন্দসই সমাবেশ থেকে সরাসরি পাবলিকেকে পেতে পারেন

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));

1
এটি এই প্রশ্নের উত্তর নয় । এটি যে উত্তরটি সম্বোধন করছে তার
কোল জনসন

-7

আমার মনে হয় আপনার দৃ strong় নাম রাখা দরকার, যা "Company.Product.T টেস্ট, সংস্করণ = 1.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = 17135d9fcba0119f" এর মতো কিছু হবে। আমি কোম্পানিকে ধরে নিয়েছি odu প্রোডাক্ট.টেষ্টগুলি আপনার সমাবেশের নাম এবং 17135d9fcba0119f সর্বজনীন কী।

এই সমস্যাটি সমাধানের আর একটি উপায় হ'ল পৃথক সমাবেশগুলি ব্যবহার না করা use আমি সাধারণত উত্স কোড এবং পরীক্ষার কোড একই সমাবেশে রাখি। আমি জানি না যে আপনার কোনও বিশেষ উদ্বেগ থাকলে আপনার অবশ্যই তাদের আলাদা করতে হবে don't


আমি মনে করি না যে আমাদের সংস্করণ নম্বর এবং সংস্কৃতি নির্দিষ্ট করতে হবে (দেখুন msdn.microsoft.com/en-us/library/… )। আমি সত্যই সমাবেশে পরীক্ষার কোডটি দেওয়ার চেষ্টা করেছিলাম। এটি চেষ্টা করে দেখুন এবং এটি কীভাবে কাজ করে (টিপের জন্য +1)।
হেমন্ত

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