我正在构建一个IronPython程序,该程序将从URL执行指定的* .dll。这是一个代码段:
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;
}
}
但是它不会编译,并不是所有的代码路径都返回一个值。
如果我是你,我会这样做。
我将保留现有方法,然后创建一个新方法。谁知道将来随着需求的变化我可能会需要它。
我们将其命名为InitializeModuleExDefault
,没有选项参数,因为它是默认值,我将在方法内指定默认值。
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
}