Статическая переменная в собственной общей библиотеке - PullRequest
0 голосов
/ 07 ноября 2019

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

Это вывод output

...