- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在我的常规 .NET 3.5 应用程序中使用 Mono 的编译器作为服务。
我已经下载了最新版本 (2.6.7),在 Visual Studio 中创建了一个简单的控制台应用程序并引用了 Mono.CSharp dll。
然后,在我的控制台应用程序中(直接来自在线示例):
Evaluator.Run("using System; using System.Linq;");
bool ress;
object res;
Evaluator.Evaluate(
"from x in System.IO.Directory.GetFiles (\"C:\\\") select x;",
out res, out ress);
foreach (var v in (IEnumerable)res)
{
Console.Write(v);
Console.Write(' ');
}
这会在 Evaluator.Run(第一行)处抛出异常:
Illegal enum value: 2049.
Parameter name: access
我相信这是因为 dll 是使用 Mono.exe 而不是 csc.exe 编译的。
我试过直接从 http://tirania.org/blog/archive/2010/Apr-27.html 下载 Mono.CSharp dll在 demo-repl.zip 文件中......并且不会引发异常......但是调用 Evaluator.Evaluate 后的输出参数(res)为空......所以我不确定出了什么问题。没有抛出异常...
所以,我想弄清楚为什么我从 demo-repl.zip 下载的 dll 返回 null。
编辑:我弄清楚了它返回 null 的原因。似乎出于某种原因,编译器没有选择 System.Linq 命名空间......虽然我不知道为什么......如果我只是评估“System.IO.Directory.GetFiles(\”C:\\")",它工作正常。
更新:Mono 编译器在拾取引用的系统程序集时肯定有问题。如果我直接复制他们的 csharp 控制台工具的示例:
csharp> var list = new int [] {1,2,3};
csharp> var b = from x in list
> where x > 1
> select x;
csharp> b;
我得到异常:
{interactive}(1,25): error CS1935: An implementation of `Select' query expressio
n pattern could not be found. Are you missing `System.Linq' using directive or `
System.Core.dll' assembly reference?
此外,为了使 MCS 实际上成为一个可行的解决方案,我需要修改编译器,以便它发出一个动态程序集,而不是每次评估调用发出一个程序集(否则它会呈现一个主要内存泄漏,我之前以 CSharpCodeProvider 的形式处理过)。有谁知道这会有多困难,或者谁能给我指明正确的方向?
谢谢。
最佳答案
好吧,我想我有一些答案。
要解决程序集加载问题,我可以在 Mono.CSharp.Driver.LoadAssembly 中调用 Assembly.LoadWithPartialName,或者在我的应用程序中执行以下操作
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
private static bool isResolving;
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (!isResolving)
{
isResolving = true;
var a = Assembly.LoadWithPartialName(args.Name);
isResolving = false;
return a;
}
return null;
}
为了使 Mono 为每个 Evaluate/Compile 调用重用相同的动态程序集,我必须更改以下内容(尽管我在这里可能遗漏了一些复杂性)......
在 Mono.CSharp.Evaluator 中,我添加了属性:
/// <summary>
/// Gets or sets a value indicating whether to auto reset when evaluations are performed and create a new assembly.
/// </summary>
/// <value><c>true</c> if [auto reset]; otherwise, <c>false</c>.</value>
public static bool AutoReset { get; set; }
然后...确保在 Init 中至少调用一次 Reset:
static void Init ()
{
Init (new string [0]);
Reset();
}
最后,在 ParseString 中,除非 AutoReset 为真,否则不要重置...
static CSharpParser ParseString (ParseMode mode, string input, out bool partial_input)
{
.
.
.
if (AutoReset) Reset ();
关于c# - Mono 编译器即服务 (MCS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3407318/
我想为给定的整数输入数组找到一个非空的连续子数组,它可以有重复的值。我尝试了分而治之的方法来查找一个数组的最大连续子数组,结果返回了与预期不同的结果。请在下面找到代码。 private static
我想在我的常规 .NET 3.5 应用程序中使用 Mono 的编译器作为服务。 我已经下载了最新版本 (2.6.7),在 Visual Studio 中创建了一个简单的控制台应用程序并引用了 Mono
我一直在阅读 MCS 锁,我觉得它很酷。现在我知道它是如何实现的,下一个问题是何时使用它。下面是我的想法。请随时将项目添加到列表中 1) 理想情况下应该在我们想要同步的线程超过 2 个时使用 2) M
我正在尝试重新创建在选择单击 Wi-Fi 状态栏项目时为当前 Wi-Fi 网络显示的信息。显示的参数之一是 MCS 索引,但我找不到使用 CWInterface 类查询此值的任何方法,这是我获取大部分
我发现 Java 中的 MCS 锁有一些非常奇怪的缓存行为。基本上,它最多可以工作四个线程(我机器上的核心数量),但会卡住更多线程。当我调试时,我发现程序卡在线路上 while (qnode.lock
我知道 .NET 和 Mono 是二进制兼容的,但给定一组源代码,csc 和 mcs 会生成完全相同的 100% 相同的二进制 CLI 可执行文件吗?人们能够判断可执行文件是用 csc 还是 mcs
需要您的帮助来解决问题。我正在 MCS 中编写一个自定义 API,其方法类型为“GET”,将参数与 URI 一起传递。 service.get('/mobile/custom/****/deviceV
我正在使用最新的 Mono 3.12.1。除了字符串插值外,所有 C#6 功能都对我有用。我正在使用 MCS 编译器。 这是我的代码: const string someString = "Some
我有一些使用 Tuple 的 C# 代码: public class Test { static void Main() { Tuple t = Tuple.Create(0,
我正在尝试创建一个使用 PKI 进行身份验证的 java 应用程序。我需要能够从 Microsoft 证书存储 (MCS) 检索证书并将其传递到 Oracle 数据库 (11.2)。 我正在使用 jd
我正在尝试按照这篇文章中的描述在 CentOS 7 上安装 MonoDevelop 4:Install Mono and Monodevelop on CentOS 5.x/6.x ,但是当我试图执行
我是一名 Unix 专家,需要尝试编译一些 C# 代码才能工作。我已经下载了适用于 Mac 的 Mono 和 mcs 命令行工具。该库附加了一个 csproj 文件,其中包含带有我需要编译的所有文件的
我们正在尝试在 OS X 的命令行上运行一个简单的 Mono 脚本。大多数脚本对我们来说工作正常,但是一旦我们尝试使用 System.Numerics,我们就会收到“错误 CS0234:类型或命名空间
我正在尝试使用 mcs 从命令行构建单个 cs 文件。我在 C# 代码中使用外部库: 使用 SomeLib 但是,我无法找到如何为 mcs 指定所需的库。如何解决此错误? 最佳答案 解决方案是使用 g
我是 linux 和 mono 的新手。我使用 将单声道安装到新的 Raspberry Pi 机器上 sudo apt-get install mono-complete. 我还使用 apt-get
我是一名优秀的程序员,十分优秀!