هل يمكنني إخبار CLR بالأجسام غير القابلة للتغيير بين AppDomains بالرجوع إليها؟
سؤال
عند تنظيم الكائنات بين AppDomains في .NET ، فإن CLR سوف يقوم إما بتسلسل الكائن (إذا كان لديه Serializable
السمة) أو ستولد وكيل (إذا كان يرث من MarshalByRef
)
مع الأوتار ، فإن CLR سوف يمرر المرجع إلى كائن السلسلة إلى AppDomain الجديد. لا يزال CLR يضمن النزاهة لأن سلاسل .NET غير قابلة للتغيير وأي تغيير من قبل AppDomain الثاني إلى السلسلة لن يؤثر على الكائن الأصلي.
ما الذي يقودني إلى سؤالي: هل هناك طريقة لإخبار CLR بأن نوعي المخصص غير قابل للتغيير وعند استخدامه في الوقت البعيد ، يجب أن يمرر الإشارة إلى الكائن كما هو الحال مع فئة السلسلة؟
المحلول
حشد هو في الواقع صعب إلى حد ما.
يُطلق على السلوك الذي تصفه "المارشال-بليد" ، ويستخدمه وقت التشغيل إلى سلاسل المارشال (أحيانًا) ونظام المارشال.
بقدر ما أستطيع أن أخبرك أنه ليس لديك أي سيطرة على هذا (المذكور في المقالة أنه يمكنك تحديد سلوك الماردة المخصص ، لكن لا يمكنني العثور على أي وثائق عليه) ، يمكن أن تمرير IntPtr حولها واستخدام رمز غير آمن لمحاكاة هذا ، لكنها تنبعث منه رائحة اختراق ضخمة بالنسبة لي.
نصائح أخرى
لا أعتقد ذلك ، لا. أعتقد أن هذا ، مثل البدائل ، يتم التعامل معه مباشرة في وقت التشغيل.
لديك فقط اثنين من الدلالات في .NET عن بعد: المارشال حسب القيمة (SerializableAttribute) والمارشال بالرجوع (Marshalbyref).
كما ألمحت ، يتم تنظيم الأوتار بالقيمة ، حيث تم تزيين النظام.
إذا كنت ترغب في تمرير كائنك بين مجالات التطبيق وتريد فقط نسخة (لا توجد تغييرات في الكائن في مجال التطبيق عن بُعد تؤثر على الكائن في مجال التطبيق المحلي) ، فإن ما تريده هو استخدام SerializableAttribute في فئتك.
أتمنى أن يساعدك هذا.