দুটি ডিএলএল-এর পক্ষে কি দ্বন্দ্ব হওয়া সম্ভব, এটি নির্মাণের সমাধান প্রতিরোধ করে?


9

যদিও আমার একটি নির্দিষ্ট মামলা আছে, তবে আমি সাধারণ পরিস্থিতি নিয়ে ভাবছিলাম।

দু'টি ডিএলএল, যখন ভিজ্যুয়াল সি # প্রকল্পের রেফারেন্স হিসাবে যুক্ত করা যায় তবে সমাধানটি বাড়ানো থেকে বিরত রাখতে একে অপরের সাথে সংঘর্ষ ঘটতে পারে? যদি এটি হয় তবে এটিকে প্রশমিত করার সম্ভাব্য উপায়গুলি কী।

উত্তর:


13

এটি খুব সম্ভব।

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

যদি আপনি নিশ্চিত হন যে আপনার অনন্য নেমস্পেস রয়েছে, তবে আপনার রেফারেন্সগুলির মতো আপনারও এই সমস্যা হবে না।

নির্ভরতার বিভিন্ন সংস্করণগুলির সাথে আরেকটি সম্ভাবনা রয়েছে - যদি আপনার প্রকল্পটি 1.2 উদাহরণে লগিং লাইব্রেরি ব্যবহার করে (উদাহরণস্বরূপ) তবে যোগ করা সমাবেশ একই সমাবেশে নির্ভর করে তবে একটি আলাদা সংস্করণ (1.3 বলুন) এবং হয় আপনার প্রকল্পটি অথবা একটি যুক্ত সংস্করণ নির্দিষ্ট সংস্করণ ব্যবহার করার জন্য কনফিগার / বিল্ট করা হয়েছে, আপনি একটি দ্বন্দ্ব পাবেন এবং বিল্ডটি ব্যর্থ হবে।

এই বর্ণনামূলক সমস্যাগুলি সমাধান করা যেতে পারে এখানে বর্ণিত হিসাবে, অ্যাসেম্বলি এলিয়াস ব্যবহার করে ।


আমি পুরোপুরি নিশ্চিত নই যে এটি সত্য। আপনি যদি সিআইএলটির দিকে নজর রাখেন, সিএলআর প্রতিটি অ্যাসেম্বরের আগে [অ্যাসেমব্লী] স্বরলিপি সহ নির্দিষ্ট অ্যাসেমব্লির মধ্যে স্পষ্টভাবে চিহ্নগুলিকে বোঝায়। এটি সম্ভব যে সি # সংকলক এই সমস্যাটি প্রয়োগ করে তবে আমি মনে করি এটি প্ল্যাটফর্মের সীমাবদ্ধ নয়।
ইয়াম মার্কোভিচ

@ ইয়াম মার্কোভিচ কমপ্লায়ার কীভাবে আবিষ্কার করবেন যে আপনি কোন নির্দিষ্ট শ্রেণিতে কোন নাম স্থানটি ব্যবহার করার চেষ্টা করছেন? সম্পূর্ণরূপে যোগ্য শ্রেণীর নাম বিরোধগুলি অবশ্যই কোনও বিল্ড প্রতিরোধ করতে চলেছে।
জেরেমি

সি # সংকলক আপনাকে একই নামের অ্যাসেমব্লিজগুলির সাথে আচরণ করার সময় (এবং সম্ভবত এটিতে একই চিহ্নগুলি সংজ্ঞায়িত করে) অ্যাসেম্বলি এলিয়াসগুলির জন্য একটি বিকল্প সরবরাহ করে। দেখুন stackoverflow.com/questions/517058/...
ইয়াম Marcovic

@ ইয়াম - সত্য, তবে আপনাকে এই পতাকাটি সম্পর্কে জানতে হবে এবং এটি ব্যবহার করতে হবে। কেবল সমাবেশ যোগ করলে বিল্ডটি ভেঙে যায়।
ওবেদের

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

4

অন্য কারও হিসাবে এটি উল্লেখ না করে দেখে আপনি জিজ্ঞাসা করেছেন:

এটি প্রশমিত করার সম্ভাব্য উপায়গুলি কী

এই ক্ষেত্রে কেবল বাধা ছাড়াই এবং বিরক্তিকর কর্মক্ষেত্র ছাড়াই একটি পরিষ্কার সমাধান রয়েছে। আপনি অ্যাসেম্বলি এলিজগুলি সংজ্ঞায়িত করতে পারেন যাতে সংকলকটি জানতে পারে কোনটি সঠিক জায়গায় উল্লেখ করা উচিত।

Http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx এ একবার দেখুন


3

হ্যাঁ, এটি খুব সম্ভব।
ধরা যাক আপনি কিছু ডিএলএল এর সাথে একটি উল্লেখ যুক্ত করেছেন যা Lucene.Net এর পুরানো সংস্করণ ব্যবহার করে এবং আপনি সর্বশেষতম সংস্করণটি অন্তর্ভুক্ত করতে চান।
আপনি বাহ্যিক উপকরণ ব্যবহার করে এই সমস্যাটি সমাধান করতে পারেন: http://msdn.microsoft.com/en-us/library/ms173212.aspx


+1 এটিকে সঠিক উত্তর বলে মনে হচ্ছে, "বাহ্যিক" ওরফে সম্পর্কে কীভাবে তা করা যায় নি।
জালান

1

আপনি লাগাতে পারেন একটি সমাবেশ বিভিন্ন সংস্করণ হিসাবে হিসাবে আপনি চান গ্লোবাল পরিষদের ক্যাশে উপলব্ধ তারা শক্তিশালী নামক রয়েছে। আপনি যদি মেশিন-ভিত্তিক কোনও অ্যাসেমব্লির বিভিন্ন সংস্করণ ব্যবহার করতে বিভিন্ন অ্যাপ্লিকেশন চান তবে এটি আপনাকে সহায়তা করতে পারে। তবে ওয়ান অ্যাপ্লিকেশনটিতে অ্যাসেমব্লির বিভিন্ন সংস্করণ ব্যবহার করা আপনাকে এখনও সমস্যায় ফেলবে।

আপনার একই সাথে উভয় সংস্করণ প্রয়োজন হওয়ার কারণ কী?


1
ভাল আমি স্পষ্টভাবে বিভিন্ন সংস্করণ যোগ করা হয় না। মূলত আমার একটি ডাব্লুপিএফ অ্যাপ্লিকেশন রয়েছে। এখন, একটি তৃতীয় পক্ষের বৈশিষ্ট্য যুক্ত করার জন্য, আমি কিছু ডিএলএল যুক্ত করেছি এবং এটি এই ডিএলএলগুলি সম্ভবত দ্বন্দ্বের মধ্যে রয়েছে।
শামীম হাফিজ

1
ঠিক আছে, তাহলে আপনি সম্ভবত এই তৃতীয় পক্ষ সম্পর্কিত ডিএলএলগুলি জিএসি-তে যুক্ত করতে পারেন? এই বিষয়গুলি সম্পর্কে পড়ার পরে অনেক দিন হয়েছে তবে আমি সন্দেহ করি এটি আপনার সমস্যার সমাধান করতে পারে।
জালান

এখানে জিএসি বলতে কী বোঝায়?
শামীম হাফিজ

1
গ্লোবাল অ্যাসেম্বলি ক্যাশে, দেখুন msdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.71%29.aspx
জালান

0

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

System.IO যার মধ্যে ফাইল ক্লাস রয়েছে

এবং

মাইপ্রজেক্ট.আইও যা একটি ফাইল ক্লাস ধারণ করে

আপনার যদি এমন কিছু থাকত ...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

... আপনার একটি দ্ব্যর্থহীন রেফারেন্স হবে, যেহেতু আপনি কোন ফাইলটির বিষয়ে কথা বলছেন তা বলার উপায় নেই। এটি এটি ঠিক করবে:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

দু'টি অ্যাসেমব্লিতেই যদি "ফাইল" এর পথ অভিন্ন হয় তবে এটি ঠিক করা একমাত্র উপায় হ'ল দু'টি ঘরের অভিন্ন নেমস্পেস কাঠামো থাকার ক্ষেত্রে এমন সম্ভাবনা নেই। উদাহরণস্বরূপ, উপরে আমার পরিস্থিতি কখনই ঘটবে না, যেহেতু কেউ সেখানে "সিস্টেম" প্রকল্পের নাম রাখছে না (নেট ফ্রেমওয়ার্কের প্রকৃত বিকাশকারীদের বাদে)।


প্রকৃতপক্ষে এটি অনেক কিছু ঘটে, যদি আপনি জনপ্রিয় তৃতীয় পক্ষের লাইব্রেরিগুলির ভিত্তিতে সমাধান তৈরি করেন। উদাহরণস্বরূপ, কোনও টুইটার লাইব্রেরিগুলি আপনার জসন লিবের পুরানো সংস্করণের উপর নির্ভর করে
হোং লং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.