einfach das Hinzufügen Option eine Antwort auf @svick. Wenn Sie die Baugruppe im Speicher behalten wollen (anstatt in eine Datei) einzugeben, können Sie die folgende Methode verwenden:
AssemblyLoadContext context = AssemblyLoadContext.Default;
Assembly assembly = context.LoadFromStream(ms);
Dies unterscheidet, dass in Net451, wo der Code ist:
Assembly assembly = Assembly.Load(ms.ToArray());
Meine Code zielt sowohl auf Net451 als auch auf Netstandard ab, daher musste ich Direktiven verwenden, um dieses Problem zu umgehen. Das vollständige Codebeispiel ist hier:
string code = CreateFunctionCode();
var syntaxTree = CSharpSyntaxTree.ParseText(code);
MetadataReference[] references = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(typeof(Hashtable).GetTypeInfo().Assembly.Location)
};
var compilation = CSharpCompilation.Create("Function.dll",
syntaxTrees: new[] { syntaxTree },
references: references,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
StringBuilder message = new StringBuilder();
using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
foreach (Diagnostic diagnostic in failures)
{
message.AppendFormat("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
}
return new ReturnValue<MethodInfo>(false, "The following compile errors were encountered: " + message.ToString(), null);
}
else
{
ms.Seek(0, SeekOrigin.Begin);
#if NET451
Assembly assembly = Assembly.Load(ms.ToArray());
#else
AssemblyLoadContext context = AssemblyLoadContext.Default;
Assembly assembly = context.LoadFromStream(ms);
#endif
Type mappingFunction = assembly.GetType("Program");
_functionMethod = mappingFunction.GetMethod("CustomFunction");
_resetMethod = mappingFunction.GetMethod("Reset");
}
}
Vielen Dank! – Mottor
Kannst du meine andere Frage sehen? http://stackoverflow.com/questions/37482955/how-can-i-use-net-core-class-library-netstandard-v1-5-into-net-framework-4 – Mottor
Ihr Beispiel funktioniert gut, aber es ist Es ist nicht möglich, 'ReadLine' oder' WriteLine' mit Parametern hinzuzufügen. Wo kann ich Dokumentation darüber bekommen, welche Überladungen und Methoden existieren? Weil es sehr komisch ist, wenn die Konsole Write-Methoden hat, aber keine ReadLine hat. –