سؤال
لدي مشكلة تعمل مع microsoft.build.buildengine. الذي من المفترض أن تحصل ثابت مع تعديل ملف. exe.config لإضافة ما يلي.
<?xml version ="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
</dependentAssembly>
<assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
مشكلتي هي أنه لا يمكنني تعديل الملف، لا بد لي من إصلاحه حسب الرمز، وأعتقد أن هذا من المفترض أن يكون ممكنا، أليس كذلك؟
ولكن كيف؟، كيف يمكنني تعديل طلبي حتى يتم تشغيله كما لو كانت التغييرات المذكورة أعلاه في ملف التكوين؟
المحلول
كنت تكافح فقط مع مشكلة مماثلة. المفتاح هو استخدام appdomain.assemblyresolve. حدث. إليك ما يشبه رمزي:
public void LoadStuff(string assemblyFile)
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler(CurrentDomain_AssemblyResolve);
var assembly = Assembly.LoadFrom(assemblyFile);
// Now load a bunch of types from the assembly...
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var name = new AssemblyName(args.Name);
if (name.Name == "FooLibrary")
{
return typeof(FooClass).Assembly;
}
return null;
}
يتجاهل هذا تماما رقم الإصدار ويدعي المكتبة المحملة بالفعل لأي مرجع مكتبة باسم "foolibrary". يمكنك استخدام السمات الأخرى لل AssemblyName
فئة إذا كنت تريد أن تكون أكثر تقييدا. FooClass
يمكن أن يكون أي فئة في جمعية foolibrary.
نصائح أخرى
إحدى طرق القيام بذلك هي إنشاء تطبيق Bootstrapping الذي عند إطلاقه بدء التطبيق الأصلي في تطبيق AppDomain منفصل. عند إعداد المجال الجديد، ستتمكن من إنشاء ملف التكوين برمجيا.