Статическая переменная в собственной общей библиотеке
Я использую эту библиотеку, которую написал для "тестирования", в частности, чтобы понять, как статические переменные работают в собственной среде. Я не настолько опытен в C#, и мой вопрос может быть чем-то просто очевидным (надеюсь, что это не так...).
Итак, я написал обертку на C в основном с целью загрузки разделяемой библиотеки и вызова определенного метода. Код C# определяет статический список SortedList, который обновляется при нескольких вызовах программы C в библиотеку C# (я использую CoreRT для компиляции). Как видите, библиотека C# обновляет статическую переменную из созданной задачи.
Например, здесь четко указано, что "Вызов одной и той же dll несколько раз" приведет к сбросу всех статических переменных.
Возможно, я ошибся, но я действительно не могу понять, почему в моем случае статическая переменная просто остается там, и она даже не переинициализируется, стирая ее содержимое, даже если я вызываю несколько раз одну и ту же библиотеку.
namespace AsyncTicker
{
class asyncTicker
{
public static SortedList< int,string > TryDict = new SortedList<int, string>();
[NativeCallable(EntryPoint = "RVExtension", CallingConvention = CallingConvention.StdCall)]
public static void RVExtension()
{
string conteggio = Convert.ToString(TryDict.Count);
if (TryDict.Count > 0) {
conteggio += " || Value of last element is:" + TryDict.Values[TryDict.Count - 1];
}
ExecuteTask();
Console.WriteLine(conteggio);
}
public static void ExecuteTask()
{
Task t1 = Task.Factory.StartNew(() =>
{
Random tmp = new Random();
int val = tmp.Next(100);
TryDict.Add(val,String.Format("test{0}",val));
});
}
}
}
void *handle = dlopen("./MyC#Lib.so", RTLD_LAZY);
typedef void (*voidFunc)();
voidFunc My1Import = __symLoad(handle, "RVExtension");
My1Import(); //Call the C# method and create a thread
sleep(3);
My1Import(); //Call the C# method and create a thread
sleep(3);
dlclose(handle);
void *handle2 = dlopen("./MyC#Lib.so", RTLD_LAZY);
voidFunc My2Import = __symLoad(handle2, "RVExtension");
My2Import(); //Call the C# method and create a thread
sleep(3);
My2Import(); //Call the C# method and create a thread
Как видите, я также несколько раз пытался загрузить библиотеку, чтобы увидеть, сбрасывается ли переменная TryDict... и ее значения просто остаются там, пока я продолжаю запускать C 'invoker'. В упомянутом вопросе было четко указано, что AppDomain создается при каждом вызове библиотеки, а затем уничтожается... так почему здесь это не так?
Спасибо всем. Я хотел бы получить только пояснение, чтобы лучше понять, почему это работает.
ps: извините за то, что предоставил так много строк кода
Это результат