Доступ к свойствам между вызовами с помощью NSIS CLR.dll - PullRequest
1 голос
/ 11 апреля 2011

Я пишу установщик, использующий NSIS, который должен проанализировать блок JSON.

Чтобы добиться этого, я надеялся, что смогу вызвать dll .Net, которая будет анализировать JSON, а затем в моем скрипте NSIS я мог вызвать свойства класса для получения необходимых мне данных.

Однако, похоже, что у NSIS CLR.dll есть проблема, когда между вызовами не поддерживается состояние класса.

Мой тестовый класс .Net выглядит следующим образом:

namespace NSISTestDll
{
    public class TestClass
    {
        private bool _configured;

        public void Configure()
        {
            _configured = true;
        }


        public string Name
        {
            get
            {
                if (_configured)
                {
                    return "John Doe";
                }
                return "Unconfigured";
            }
        }

    }
}

И часть моего сценария NSIS, которая вызывает это:

File "NSISTestDll.dll"
CLR::Call /NOUNLOAD "NSISTestDll.dll" "NSISTestDll.TestClass" "Configure" 0

CLR::Call /NOUNLOAD "NSISTestDll.dll" "NSISTestDll.TestClass" get_Name 0
pop $0  
MessageBox MB_OK $0

В блоке сообщений отображается «неконфигурированный», а не ожидаемый «Джон Доу».

Читая форум на CLR.dll, создатель плагина упоминает, что это проблема.

Кто-нибудь знает обходной путь для этого?

Одна вещь, о которой я думал, это написать оболочку на C ++ и использовать вместо нее System.dll, чтобы я мог передать нужные значения обратно непосредственно в переменные сценария NSIS.

Другой альтернативой является анализ JSON для каждого свойства, которое мне нужно получить, JSON достаточно мал, чтобы это не слишком сильно сказывалось на производительности.

1 Ответ

2 голосов
/ 11 апреля 2011

При вызове, подобном CLR::Call /NOUNLOAD ... / NOUNLOAD применяется только к CLR dll (Плагин). Плагин CLR сам должен был бы придумать / поддерживать свой собственный параметр, если бы ему нужно было загружать NSISTestDll

...