首页 > 解决方案 > C# Roslyn 是否可以在 Android 上工作(使用 Xamarin)?

问题描述

我最近使用 Roslyn 在游戏应用程序的运行时编译和执行代码。感谢一些有用的资源,例如这个网站Vendettamit answer,我设法在窗口 10 上的 C# Console Net Core 项目上编写了一个程序,该程序执行位于应用程序根目录下的 txt 文件中的代码。

using System;

namespace Test15
{
    public class Program
    {
        public static int Main()
        {
            System.Console.WriteLine("Hello World from external Dll !");
            System.Console.WriteLine("And it work !");
            return 10;
        }
    }
}

我不打算分享代码,因为它与Vendettamit answer非常相似,并且该程序在窗口 10 上的 C# Console Net Core 项目上运行良好。

所以下一步,我尝试让这个程序在一个使用 Xamarin 的 Android 项目上与 C# Monogame 框架一起工作。

第一个问题:在尝试添加 Roslyn 似乎需要的块包“Microsoft.CodeAnalysis”时,出现以下 2 个错误:

Unable to resolve reference 'Humanizer', referenced by `Microsoft.CodeAnalysis.CSharp.Workspaces`.
Add NuGet package or assembly reference for 'Humanizer', or remove the reference to
'Microsoft.CodeAnalysis.CSharp.Workspaces'. Game2

Unable to resolve reference 'SQLitePCLRaw.core', referenced by `Microsoft.CodeAnalysis.Workspaces`.
Add NuGet package or assembly reference for 'SQLitePCLRaw.core', or remove the reference to
'Microsoft.CodeAnalysis.Workspaces'. Game2

(从法语翻译)

当用“microsoft.CodeAnalysis.CSharp”替换“Microsoft.CodeAnalysis”块包时,两个错误都消失了。

但是在运行时,添加 MetadataReference 不起作用。例如在我使用的控制台项目中: MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location);

要将 MetadataReference 添加到 mscorlib.dll,但在 Android 项目中,它会崩溃,因为typeof(object).GetTypeInfo().Assembly.Locationreturn"mscorlib.dll"而不是类似的东西"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.9\System.Private.CoreLib.dll",因为我猜我们在 Android 上。(与其他 MetadataReference 相同)

因此,在调用方法时CSharpCompilation.Create(),“reference”参数是一个 null MetadataReference 数组,它会崩溃。

根据我阅读的内容,我认为(但我不确定)Roslyn 无法在 android 上工作,因为 System.Object 的位置缺失。

那么,如果有办法在 Android 上使用 Roslyn,有人可以确认(或无效)吗?

(如果您知道在任何设备上编译/执行或“解释” C# 代码的其他方式,则可以加分)

感谢阅读并保持安全。

标签: c#androidcompilationcross-platformroslyn

解决方案


推荐阅读