Мне нужна помощь в создании опций в словарепараметры - PullRequest
0 голосов
/ 25 октября 2019

Я создаю программу IronPython, которая будет выполнять указанные * .dll из URL. Вот фрагмент:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Net;
using IronPython.Runtime.Operations;


public class Program
{
    [STAThread]
    public static void my()

    {
        WebClient wc = new WebClient();
        PythonOps.InitializeModuleEx(Assembly.Load(wc.DownloadData("https://data/from/url.dll")), "__main__", null, false, null);
    }
    public static void Main(string[] args)
    {
        Program.my();
    }
}

Для этого используется функция: PythonOps.InitializeModuleEx. Все работает нормально, только проблема в том, что он принимает аргументы от: Environment.GetCommandLineArgs. Я посмотрел на часть этой функции в pythonops.cs и заметил, что если options == null, то получится Environment.GetCommandLineArgs, что мне не нужно. Ниже приведена ссылка на PythonOps.cs:

        public static int InitializeModuleEx(Assembly/*!*/ precompiled, string/*!*/ main, string[] references, bool ignoreEnvVars, Dictionary<string, object> options) {
            ContractUtils.RequiresNotNull(precompiled, nameof(precompiled));
            ContractUtils.RequiresNotNull(main, nameof(main));

            if(options == null) {
                options = new Dictionary<string, object>();
            }
            options["Arguments"] = Environment.GetCommandLineArgs();

            var pythonEngine = Python.CreateEngine(options);

            var pythonContext = (PythonContext)HostingHelpers.GetLanguageContext(pythonEngine);

Мне нужна помощь, чтобы понять, как лучше всего решить эту проблему. Должен ли я просто создать пример с одним аргументом, чтобы эта функция не вызывалась? Если да, то как мне это сделать?

В общем, я просто хочу использовать жестко закодированные аргументы в коде, чтобы передавать их программе, а не читать их из командной строки.

ОБНОВЛЕНИЕ 2:

Спасибо за ответ, это мой исправленный код:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Net;
using IronPython.Runtime.Operations;



public class Program
{
    public static int InitializeModuleExDefault(
      Assembly precompiled,
      string main,
      string[] references,
      bool ignoreEnvVars)
    { 

        IDictionary<string, object> options = new Dictionary<string, object>();
        options.Add("Arguments", new Object {}); // replace with whatever object you want
    } 

public static int Main()
    {
        int InitializeModuleExDefault;
        try
        {
            WebClient wc = new WebClient();
            InitializeModuleExDefault = PythonOps.InitializeModuleEx(Assembly.Load(wc.DownloadData("https://data/from/url.dll")), "__main__", null, false);
        }
        catch (Exception ex)
        {
            string text = ex.Message;
            Console.WriteLine("Error occurred: {0}", text);
            InitializeModuleExDefault = -1;
        }
        return InitializeModuleExDefault;
    }
}

Однако он не будет компилироваться, говоря, что не все пути кода возвращают значение.

...