Статическая переменная в собственной общей библиотеке

Я использую эту библиотеку, которую написал для "тестирования", в частности, чтобы понять, как статические переменные работают в собственной среде. Я не настолько опытен в 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: извините за то, что предоставил так много строк кода

Это результат выход

0 ответов

Другие вопросы по тегам