После виртуализации кода верните пустое значение - PullRequest
0 голосов
/ 24 ноября 2018

Я не знаю, это ошибка или моя ошибка ?, После виртуализации кода верните пустое значение.

[assembly: Obfuscation(Feature = "Apply to type *: apply to member * when method or constructor: virtualization", Exclude = false)]

namespace ConsoleApp17
{
    class Program
    {
        private static bool valueWritten = false;
        private static int sharedValue = 0;

        private static void ThreadOneStart()
        {
            sharedValue = 1000;
            valueWritten = true;
        }

        private static void ThreadTwoStart()
        {
            if (valueWritten) Console.Write(sharedValue == 1000 ? "Good" : "Bad");
        }

        static void Main(string[] args)
        {
            Thread threadOne = new Thread(ThreadOneStart);
            Thread threadTwo = new Thread(ThreadTwoStart);

            threadOne.Start();
            threadTwo.Start();

            threadOne.Join();
            threadTwo.Join();

            Console.ReadKey();
        }
    }
}

1 Ответ

0 голосов
/ 09 декабря 2018

Данная программа имеет состояние гонки.Это подразумевает, что поведение программы не определено.Это не имеет ничего общего с Eazfuscator.NET.

Вот правильный способ сделать это:

[assembly: Obfuscation(Feature = "Apply to type *: apply to member * when method or constructor: virtualization", Exclude = false)]

class Program
{
    private static bool valueWritten = false;
    private static int sharedValue = 0;
    private static ManualResetEvent ev = new ManualResetEvent(false);

    private static void ThreadOneStart()
    {
        sharedValue = 1000;
        valueWritten = true;
        ev.Set();
    }

    private static void ThreadTwoStart()
    {
        ev.WaitOne();
        if (valueWritten) Console.Write(sharedValue == 1000 ? "Good" : "Bad");
    }

    static void Main(string[] args)
    {
        Thread threadOne = new Thread(ThreadOneStart);
        Thread threadTwo = new Thread(ThreadTwoStart);

        threadOne.Start();
        threadTwo.Start();

        threadOne.Join();
        threadTwo.Join();

        Console.ReadKey();
    }
}
...