פתרון חבילת תחקיר והפצה¶
הסדר המחויב הוא יצירת context לפני שה־callback רשאי להשתמש בו, פרסום תוצאה לפני צריכתה, יציאת כל callback לפני Joined, ו־Joined לפני Released. האירוע Registered שמודפס אחרי חזרת פונקציית הרישום יכול להופיע אחרי CallbackEntered, מפני שה־callback רשאי להגיע לפני שהקריאה חזרה. זאת אינה תקלה בתזמון אלא סיבה לאתחל את המצב קודם.
ה־resolver הבא הוא קטע initialization עבור assembly שמכיל את הצהרות ה־P/Invoke של הספרייה שלנו. יש לקרוא לו פעם אחת לפני הקריאה הראשונה לספרייה, ואין להחליף את resolver של assembly שאינו בבעלותנו.
using System.Reflection;
using System.Runtime.InteropServices;
NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(),
(name, assembly, searchPath) =>
{
if (name != "sum_native") return 0;
string path = Path.Combine(AppContext.BaseDirectory, "sum_native.dll");
return NativeLibrary.Load(path);
});
ה־loader עדיין צריך למצוא את התלויות של sum_native.dll, ולכן נתיב מלא לספרייה הראשית אינו בדיקה מספקת של כל החבילה. נפרסם dependencies מתאימות ונבדוק את מדיניות החיפוש שלהן. במקרה export חסר הטעינה יכולה להצליח ורק פתרון הסמל ייכשל. במקרה ABI version לא נתמך ה־DLL והסמל קיימים, והכשל הוא status מתוכנן של החוזה.
דוח טוב יאמר למשל שהקוד המנוהל נבנה ורץ על x64 עם גרסת runtime מסוימת, שה־DLL נבנה עם toolchain מסוים, וש־ARM64 טרם נבדק אם אין סביבת יעד. אין להחליף את החסר בטענה כללית של "נבדק על ווינדוס". בדיקת regression תשתמש באותם מזהי אירועים ובאותו קלט כדי להוכיח שה־Released המאוחר פתר את הפרת החיות שנראתה קודם.