我正在尝试将一些 .net 代码移植到新的 Core 运行时,但在移植一些即时编译时遇到了麻烦。
要恢复,它总是要求我引用 System.Runtime 和 mscorlib,但不知道如何引用它们。
附带说明一下,我无法引用 Framework 4.6,因为该项目必须发布到具有 .net Core 的 Linux 计算机。
这是最小的代码:
string testClass = @"using System;
namespace test{
public class tes
{
public string unescape(string Text)
{
return Uri.UnescapeDataString(Text);
}
}
}";
var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString() + ".dll")
.WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary))
.AddReferences(
MetadataReference.CreateFromFile(typeof(Object).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location)
)
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));
var eResult = compilation.Emit("test.dll");
它总是抱怨需要 mscorlib (在本例中)和 System.Runtime (在我的实际项目中)。
我正在使用 Microsoft.CodeAnalysis.CSharp 包版本 2.0.0-beta3
关于如何使用 Roslyn 和 .net Core 进行动态编译有什么想法吗?
好的,终于可以工作了:
string testClass = @"using System;
namespace test{
public class tes
{
public string unescape(string Text)
{
return Uri.UnescapeDataString(Text);
}
}
}";
var dd = typeof(Enumerable).GetTypeInfo().Assembly.Location;
var coreDir = Directory.GetParent(dd);
var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString() + ".dll")
.WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary))
.AddReferences(
MetadataReference.CreateFromFile(typeof(Object).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "mscorlib.dll"),
MetadataReference.CreateFromFile(coreDir.FullName + Path.DirectorySeparatorChar + "System.Runtime.dll")
)
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));
var eResult = compilation.Emit("test.dll");
我不喜欢它,因为硬编码,但似乎这是让它工作的唯一方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)