Я использую эту библиотеку, которую я написал для «тестирования», в частности, для понимания того, как статические переменные работают в собственной среде. Я не настолько опытен в C #, и мой вопрос может быть чем-то просто очевидным (я надеюсь, что это не так ...).
Итак, я написал оболочку на C, главным образом с целью загрузки общего ресурса. библиотека и вызов определенного метода. Код C # определяет статический SortedList, который обновляется при множественных вызовах из программы на C в библиотеку C # (я использую CoreRT для компиляции). Как вы можете видеть, библиотека C # обновляет статическую переменную из созданной задачи.
Например, здесь четко указано, что «Многократный вызов одного и того же dll» сбросит все статические переменные ..
Является ли статическая переменная в библиотеке (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: извините за предоставление такого количества строк кода
Это вывод