سؤال

لقد اصطدمت بموقف غريب مع MSBuild للتو.هناك حل له ثلاثة مشاريع:LibX وLibY وExe.يشير إكس إلى LibX.يشير LibX بدوره إلى LibY، ويحتوي على بعض ملفات المحتوى، ويشير أيضًا إلى مكتبة تابعة لجهات خارجية (تم تثبيت العديد من التجميعات المعدة مسبقًا في كل من مجلد GAC ومجلد lib المحلي).يتم وضع علامة على مكتبة الطرف الثالث على أنها "نسخ محلي" ("خاصة") وتظهر في مخرجات مشروع LibX، كما هو الحال في مخرجات LibY وملفات محتوى LibX.الآن، يحتوي مخرج مشروع Exe على مخرجات مشروع LibX، وملفات المحتوى الخاصة بمشروع LibX، ومخرجات مشروع LibY (القادمة من LibX)، ولكن لا توجد تجميعات لمكتبة تابعة لجهات خارجية.

لقد قمت الآن بحل هذه المشكلة من خلال الرجوع إلى مكتبة الطرف الثالث مباشرة في مشروع Exe، لكنني لا أشعر أن هذا هو الحل "الصحيح".

هل تعرض أحد لهذه المشكلة مسبقا؟

هل كانت مفيدة؟

المحلول

نعم، لقد واجهت هذه المشكلة أيضًا.على الرغم من أنني أود أن أقول خلاف ذلك، أعتقد أنه يجب عليك تضمين كافة التبعيات المتعدية كمراجع في ملف البناء الخاص بك.

نصائح أخرى

هناك اختلاف في السلوك عند البناء باستخدام MSBuild (أي:سطر الأوامر و TFS Build والأدوات الأخرى) مقارنة بالإنشاء باستخدام Visual Studio.لا يتم تضمين المراجع الثانوية في متغير المراجع المرسل إلى مهام ترجمة MSBuild.

هناك العديد من نقاط الامتداد التي يوفرها MSBuild لتغيير كيفية حل المراجع.لقد استخدمت AfterResolveReference بنجاح لإصلاح هذه المشكلة لبعض مشاريعي - لقد قمت بنشر المزيد من المعلومات حول الخلفية على مدونتي.

الحل البديل هو إضافة التعليمة البرمجية التالية إلى ملفات vbproj أو csproj

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

صرحت Microsoft أن هذا لن يتم إصلاحه يتصل

يمكنك بالفعل الانتقال إلى ملف Microsoft.CSharp.targets أو Microsoft.VisualBasic.targets (الموجود في دليل إطار العمل، عادةً C:\Windows\Microsoft.NET\Framework\v3.5) وتعديل معلمات مهمة csc أو vbc إلى تضمين تبعيات مرجعية إضافية.في الملف (أهداف VB، السطر 166؛أهداف C#، السطر 164) التغيير:\

References="@(ReferencePath)"

ل

References="@(ReferencePath);@(ReferenceDependencyPaths)"

قد يتسبب هذا في حدوث مشكلات أخرى اعتمادًا على مدى تعقيد الأمور وقد يؤدي إلى حيل مع برنامج التحويل البرمجي Visual Studio inproc، ولكنها الطريقة الوحيدة للقيام بذلك في MSBuild التي وجدتها.

كاد إجابة جوسانت أن تنجح معي؛ظللت أتلقى خطأ في Visual Studio عندما حاولت ذلك:

حدثت مشكلة أثناء محاولة تعيين معلمة "المراجع" لبرنامج التحويل البرمجي قيد التشغيل الخاص بـ IDE.تم إرجاع الخطأ HRESULT E_FAIL من استدعاء مكون COM

كان الحل لمشكلتي هو وضع شرط على ItemGroup، مثل هذا:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

أدى ذلك إلى تجاهل Visual Studio للتغيير المرجعي تمامًا، ويعمل البناء بشكل جيد محليًا وعلى خادم الإنشاء.

لقد قمت بدمج أعمال Alex Yakunin حل مع واحد من شأنه قم أيضًا بنسخ ملفات dll الأصلية.

تفشل طريقة AfterResolveReferences إذا كان لديك رسم بياني موجه وليس شجرة بها خطأ "محاولة نشر نسخ مختلفة من ملف dll".(راجع كيفية تكوين msbuild/MSVC لنشر الملفات التابعة للتجميعات التابعة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top