سؤال

حسنا, لذلك أنا فقط وقعت في المشكلة التالية التي رفعت حاجب.

لأسباب مختلفة لدي اختبار الإعداد حيث اختبار دروس في TestingAssembly.dll تعتمد على TestingBase الدرجة في BaseTestingAssembly.dll.واحدة من الأشياء التي TestBase في الوقت الراهن هو البحث عن بعض الموارد المضمنة الخاصة به و تدعو الجمعية

لذا BaseTestingAssembly الواردة السطور التالية...

public class TestBase {    
  private static Assembly _assembly;
  private static Assembly _calling_assembly;

  static TestBase() {
    _assembly = Assembly.GetExecutingAssembly();
    _calling_assembly = Assembly.GetCallingAssembly();
  }
}

ثابت منذ ان عرفت هذه الجمعيات سيكون نفس على تطبيق عمر فلماذا يكلف نفسه عناء إعادة حساب لهم في كل اختبار.

عند تشغيل هذا ومع ذلك لاحظت أن كل _assembly و _calling_assembly يجري تعيين BaseTestingAssembly بدلا من BaseTestingAssembly و TestingAssembly على التوالي.

تحديد المتغيرات غير ثابت ولا وجود لهم في تهيئة منتظم منشئ ثابت هذا ولكن أنا في حيرة لماذا حدث هذا أن يبدأ هذا.ظننت ثابت منشئات تشغيل أول الوقت ثابت عضو يحصل المشار إليها.هذا يمكن أن يكون فقط من TestingAssembly التي ينبغي أن ثم تم المتصل.لا أحد يعرف ما يمكن أن يحدث ؟

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

المحلول

منشئ ثابت يسمى قبل وقت غير مباشرة عن طريق رمز المستخدم.يمكنك ان ترى هذا من خلال وضع نقطة توقف في منشئ ثم تشغيل في المصحح.وظيفة فورا أعلاه في الدعوة سلسلة التعليمات البرمجية الأصلية.

تحرير: هناك الكثير من الطرق التي ثابتة المهيآت تشغيل في بيئة مختلفة عن غيرها رمز المستخدم.بعض الطرق الأخرى هي

  1. إنهم ضمنا محمية ضد سباق الظروف الناتجة عن خاصية تعدد
  2. لا يمكنك التقاط استثناءات من خارج مهيئ

أنه من الأفضل عدم استخدامها لأي شيء متطورة جدا.يمكنك تطبيق واحد-الحرف الأول مع النمط التالي:

private static Assembly _assembly;
private static Assembly Assembly {
  get {
    if (_assembly == null) _assembly = Assembly.GetExecutingAssembly();
    return _assembly;
  }
}

private static Assembly _calling_assembly;
private static Assembly CallingAssembly {
  get {
    if (_calling_assembly == null) _calling_assembly = Assembly.GetCallingAssembly();
    return _calling_assembly;
  }
}

إضافة قفل إذا كنت تتوقع مؤشرات الوصول.

نصائح أخرى

أعتقد أن الجواب هنا في مناقشة C# ثابت المنشئات.تخميني هو أن منشئ ثابت هو الحصول على من دعا غير متوقع لأن السياق:

المستخدم لديه أي سيطرة على منشئ ثابت يتم تنفيذها في البرنامج

الجمعية.GetCallingAssembly() ببساطة إرجاع الجمعية من دخول الثانية في مكدس الاستدعاءات.يمكن جدا تبعا حيث كيف طريقة/جالبة/منشئ يسمى.هنا هو ما فعلته في المكتبة للحصول على الجمعية من الأسلوب الأول الذي ليس في مكتبتي.(هذا حتى يعمل في ثابت المنشئات.)

private static Assembly GetMyCallingAssembly()
{
  Assembly me = Assembly.GetExecutingAssembly();

  StackTrace st = new StackTrace(false);
  foreach (StackFrame frame in st.GetFrames())
  {
    MethodBase m = frame.GetMethod();
    if (m != null && m.DeclaringType != null && m.DeclaringType.Assembly != me)
      return m.DeclaringType.Assembly;
  }

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