亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在NetStandard2.0項目中使用Roslyn編譯動態創建的代碼

在NetStandard2.0項目中使用Roslyn編譯動態創建的代碼

C#
一只名叫tom的貓 2023-12-17 10:43:15
我正在嘗試創建一個可重用的 .NET Standard 2.0 庫,該庫使用 Roslyn 在運行時將代碼動態編譯為內存中的程序集。這個動態創建的程序集包含從作為庫一部分的基類派生的類。我通過引用該庫的應用程序中的反射來實例化它們。項目結構如下所示:假設我的 netstandard2.0 庫中有以下類型:namespace MyLibrary{    public abstract class BaseClass    {        public abstract int CalculateSomething();    }}然后,我在 .NET Core 2.2 項目中創建以下單元測試:namespace NetCore2_2.Tests{    public static class RoslynTests    {        [Fact]        public static void CompileDynamicallyAndInvoke()        {            // Create syntax tree with simple class            var syntaxTree = CSharpSyntaxTree.ParseText(@"using System;using MyLibrary;namespace Foo{    public sealed class Bar : BaseClass    {        public override int CalculateSomething()        {            return (int) Math.Sqrt(42);        }    }}");在此測試中,我首先解析源自 netstandard2.0 庫中的BaseClass 的一段 C# 代碼。這段代碼還引用了System.Math。然后,我創建一個 C# 編譯對象,其中包含對(.NET Core 2.2 的)核心庫和我的庫的引用。該編譯對象將 DLL 發送到內存流。如果編譯失敗,測試將失敗并出現包含所有診斷信息的異常。此單元測試失敗并顯示以下錯誤消息:(7,31):錯誤CS0012:類型“對象”;在未引用的程序集中定義。您必須添加對程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。(11,26):錯誤CS0012:類型“對象”;在未引用的程序集中定義。您必須添加對程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。我有以下問題:這是否不起作用,因為 Roslyn NuGet 包在 .NET Standard 2.0 項目中被引用,因此總是嘗試編譯為 netstandard2.0 目標框架 Moniker? 我懷疑netstandard2.0 對 System.Object 有不同的定義,轉發到目標平臺的實際實現。而且我的編譯單元中并沒有引用這個轉發定義。有辦法更改目標框架嗎?我查看了CSharpCompilationOptions和EmitOptions,但無法 39;沒有找到任何可以讓我改變目標框架的東西。我是否需要使用其他 Roslyn NuGet 軟件包,例如 Microsoft.Net.Compilers.Toolset? 我嘗試避免這種情況,因為實際上想使用默認編譯器而不是 NuGet 包中的編譯器。
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

  • 它不起作用,因為您的庫包含BaseClass,目標為.netstandard2.0(這意味著該庫引用了< a i=3>),并且這假設您的庫(使用?引用庫)應該引用?以正確解析所有相應的類型。因此,您應該添加對它們的引用(?的?或?的類似?)。 (順便說一句,當您從?庫引用?時,您可能應該添加幾個額外的庫作為?的引用)?netstandard.dll 2.0BaseClassnetstandard.dll 2.0netstandard.dll.net47.netstandard.dll.netcore2.2.netstandard2.0.net47path_to_visual_studio\MSBuild\Microsoft\Microsoft.NET.Build.Extensions

  • Roslyn?Compilation?對目標框架一無所知,而且它不應該對目標框架有任何了解它。?使用樹和引用(當然還有一些選項和引用的元數據),因此您應該手動附加編譯時所需的引用。 (順便說一句,如果您有?或?文件,您可以使用?來從在大多數情況下,項目或解決方案文件)CompilationcsprojslnMsBuildWorkspace

  • 如果您知道或可以找到編譯所需的所有引用,我建議您手動創建Compilation,否則嘗試使用Microsoft .CodeAnalysis.Workspaces.MSBuild?用于分析?.csproj?或?.sln?文件,然后從中檢索?Compilation他們。?Microsoft.Net.Compilers.Toolset?只是讓您可以通過未安裝在您的系統上但包含在此包中的編譯器來編譯您的項目。


查看完整回答
反對 回復 2023-12-17
  • 1 回答
  • 0 關注
  • 358 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號