У меня небольшая проблема.Я использую компилятор ROSLYN и пытался вызвать метод
RoslynTest.ComputeClass.Compute, но я получил ошибку времени выполнения "System.MissingMethodException:" Метод RoslynTest.ComputeClass.Compute не найден. "Метод находится в кратком коде в переменной g_code в RoslynTest.RoslynInterface
InitCompiler и полный исходный код в MS VS 2019 здесь:
https://drive.google.com/file/d/1TRKshJhApC2ByC961I9f__axjTyGCdnm/view?usp=sharing
итакже в тексте ниже. Проблема возникает из-за передачи переменной типа массива в метод в
InvokeCode(ref MyData[,] t_array )
, если вместо «MyData [,] t_array» нет «MissingMethodException», а используется простая переменная, например Int32 Aвозникают.
Проблема вызвана передачей переменной типа массива методу в
InvokeCode(ref MyData[,] t_array )
, если вместо «MyData [,] t_array« no »используется простая переменная, например Int32 AMissingMethodException "возникают.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
namespace RoslynTest
{
public class MyData
{
public Int32 x;
public Int32 y;
}// public class MyData
public class RoslynInterface
{
public String g_code;
SyntaxTree g_syntaxTree;
string g_assemblyName;
CSharpCompilation g_compilation;
MetadataReference[] g_references;
MemoryStream g_ms;
EmitResult g_result;
Assembly g_assembly;
Type g_type;
object g_obj;
IEnumerable g_failures;
Object g_return_Object;
Type g_return_Type;
public String g_errorMessages;
public Boolean InitCompiler()
{
g_code = @"
using System;
namespace RoslynTest
{
public class MyData
{
public Int32 x;
public Int32 y;
}// public class MyData
public class ComputeClass
{
public Boolean Compute(ref MyData[,] t_array)
{
t_array[0, 0].x = 20;
t_array[0, 0].y = 20;
return false;
}//
}// public class ComputeClass
}// namespace RoslynTest
";
g_syntaxTree = CSharpSyntaxTree.ParseText(@g_code);
g_assemblyName = Path.GetRandomFileName();
g_references = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location)
};
g_compilation = CSharpCompilation.Create(g_assemblyName,
syntaxTrees: new[] { g_syntaxTree },
references: g_references,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
g_ms = new MemoryStream();
g_result = g_compilation.Emit(g_ms);
if (!g_result.Success)
{
g_failures = g_result.Diagnostics.Where(
diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
g_errorMessages = "";
foreach (Diagnostic diagnostic in g_failures)
{
g_errorMessages = g_errorMessages + diagnostic.Id.ToString() + " " + diagnostic.GetMessage() + System.Environment.NewLine;
}// foreach
}
else
{
g_ms.Seek(0, SeekOrigin.Begin);
g_assembly = Assembly.Load(g_ms.ToArray());
g_type = g_assembly.GetType("RoslynTest.ComputeClass");
g_obj = Activator.CreateInstance(g_type);
}// if else
return g_result.Success;
}// public Boolean CreateBWImage()
public Boolean InvokeCode(ref MyData[,] t_array )
{
g_return_Object = g_type.InvokeMember("Compute",
BindingFlags.InvokeMethod, // BindingFlags.Default |
null,
g_obj,
new object[] { t_array });
g_return_Type = g_return_Object.GetType();
return (Boolean)g_return_Object;
}// public Boolean InvokeCode()
}// public class RoslynCompiler
public class Program
{
static void Main(string[] args)
{
MyData[,] md = new MyData[5, 5];
for (Int32 x = 0; x
Я получил ошибку времени выполнения" System.MissingMethodException: 'Метод RoslynTest.ComputeClass.Compute не найден.'