การอ้างอิงไลบรารีใน .NET Framework ที่ไม่ได้อยู่ใน .NET Standard

ขณะนี้ฉันกำลังดำเนินการย้ายโครงการไลบรารีคลาสไปยัง dotnet cli (RC2) จาก DNX (RC1) ก่อนหน้านี้ โปรเจ็กต์อ้างอิงไลบรารีเฟรมเวิร์ก .NET v4.5.1 และไฟล์ project.json มีลักษณะดังนี้:

  "frameworks": {
    "net451": {
      "frameworkAssemblies": {
        "System.Runtime": "4.0.10.0",
        "System.Web": "4.0.0.0",
        "System.DirectoryServices": "4.0.0.0",
        "System.DirectoryServices.AccountManagement": "4.0.0.0",
        "System.ServiceModel": "4.0.0.0",
        "System.ServiceModel.Security": "4.0.0.0"
      }
    }
  }

เท่าที่ฉันรู้ (และฉันอาจผิด) ซึ่งแตกต่างจาก DNX คือ dotnet Cli ใหม่ไม่รองรับ .NET 4.5.1 แต่รองรับ .NET Standard แทน

ปัญหาคือ .NET Standard ไม่มีไลบรารีทั้งหมดที่ฉันต้องการ ฉันต้องเปลี่ยนแปลงอะไรบ้างเพื่อให้สามารถอ้างอิงไลบรารีเฟรมเวิร์ก .NET 4.5.1 ได้ ฉันอ่านเกี่ยวกับคำสั่งการนำเข้าแล้ว แต่ใช้งานไม่ได้ นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ (อัปเดต):

  "frameworks": {
    "net451": {
      "frameworkAssemblies": {
        "System.Runtime": "4.0.10.0",
        "System.Web": "4.0.0.0",
        "System.DirectoryServices": "4.0.0.0",
        "System.DirectoryServices.AccountManagement": "4.0.0.0",
        "System.ServiceModel": "4.0.0.0",
        "System.ServiceModel.Security": "4.0.0.0"
      }
    },
    "netstandard1.5": {
      "imports": [ "dnxcore50", "portable-net451+win8" ]
    }
  }

ฉันได้รับข้อผิดพลาดเช่นนี้:ไม่สามารถอ้างอิง ParallelQuery

ฉันหลงทางเล็กน้อยกับสิ่งอื่นที่ฉันต้องทำ... มีความคิดเห็นอะไรบ้าง?


person painiyff    schedule 19.05.2016    source แหล่งที่มา


คำตอบ (3)


dotnet รองรับ net451 ต่อไปนี้คือตัวอย่างแอปพลิเคชันที่มีทั้ง net451 และ netstandard

หากแอปของคุณทำงานบนเดสก์ท็อปเต็มรูปแบบใน RC1 ก็ไม่น่าจะมีปัญหาในการโยกย้ายไปยังเดสก์ท็อปเต็มรูปแบบใน RC2

person Victor Hurdugaci    schedule 19.05.2016
comment
คุณขาดการอ้างอิงแพ็คเกจบางส่วนสำหรับ netstandard ParallelQuery อยู่ใน System.Linq.Parallel เพิ่มสิ่งนั้นลงในส่วนของการอ้างอิง นี่คือตัวอย่าง: github.com/ aspnet/Options/blob/dev/src/ - person Victor Hurdugaci; 19.05.2016
comment
ฉันเห็นแล้ว ขอบคุณ ฉันเพิ่งมีข้อผิดพลาดอีก 2 ข้อ System.Web หายไป และไลบรารี System.Data ไม่มีข้อกำหนด DataRow และ DataColumn (แต่มี DataTable) มีความคิดอะไรบ้าง? - person painiyff; 19.05.2016
comment
System.Web ไม่มีอยู่สำหรับ CoreCLR คุณจะต้องมองหาทางเลือกอื่น - person Victor Hurdugaci; 19.05.2016

ลองหมุนด้วย netcoreapp1.0 แทน netstandard1.5

เทมเพลต RC2 ใหม่ สร้างองค์ประกอบ project.json กรอบงานต่อไปนี้ (โดยค่าเริ่มต้น):

"frameworks": {
  "netcoreapp1.0": {
    "imports": [
      "dotnet5.6",
      "dnxcore50",
      "portable-net45+win8"
    ]
  }
},

มีการพูดคุยกันเล็กน้อยเกี่ยวกับเรื่องนี้ใน GitHub หากต้องการอ้างอิง Richlander:

  • netstandard -> NETStandard.Library (คาดว่าจะทำงานได้บน .NET ทั้งหมด)
  • netstandardapp -> NETStandard.App (เหมือนกับ NETStandard.Library + โฮสต์แอป)
  • netcoreapp -> Microsoft.NETCore.App (นี่คือการติดตั้งฐาน. NET Core)
person Will Ray    schedule 19.05.2016
comment
ฉันลองสิ่งนี้แล้ว แต่ก็ยังมีข้อผิดพลาดเหมือนเดิมไม่มากก็น้อย - person painiyff; 26.05.2016

ตรวจสอบเอกสารประกอบมาตรฐานของแพลตฟอร์ม .NET บน GitHub

ชื่อเล่น netstandard1.5 เป้าหมายมีเป้าหมายที่ .NET 4.6.2 ซึ่งหมายความว่าคุณไม่สามารถรันด้วยโปรเจ็กต์ .NET 4.5.1 ได้

ชื่อเล่นที่ถูกต้องในการกำหนดเป้าหมาย .NET 4.5.1 ขึ้นไปคือ netstandard1.2

โดยพื้นฐานแล้ว ชื่อเล่นเป้าหมายจะบอกคุณว่าเฟรมเวิร์กใดที่สนับสนุน ต่ำสุด ยิ่งเฟรมเวิร์กที่ได้รับการสนับสนุนต่ำ คุณก็ยิ่งสามารถกำหนดเป้าหมายด้วยชื่อเล่นเดียวได้มากขึ้นโดยไม่ต้องใช้คำสั่งตัวประมวลผลล่วงหน้าแบบมีเงื่อนไข

แต่ยิ่งชื่อเล่นเป้าหมายต่ำ คุณลักษณะใหม่ก็จะยิ่งใช้งานไม่ได้ (เช่น Task.CompletedTask)

เมื่อคุณต้องการกำหนดเป้าหมายเฟรมเวิร์กเก่าและต้องการใช้ฟังก์ชันใหม่ คุณต้องใช้หลายเป้าหมาย เช่น netstandard1.2 ซึ่งใช้ api เก่าและ netstandard1.3 ที่ใช้ .NET 4.6+ Api และใช้คำสั่งตัวประมวลผลล่วงหน้าแบบมีเงื่อนไขเพื่อใช้การเรียก Api ใหม่ใน เป้าหมายเฉพาะ

person Tseng    schedule 19.05.2016
comment
ฉันคิดว่าคุณคิดย้อนกลับไปแล้ว: คำถามนี้เกี่ยวกับการอ้างอิงแอสเซมบลีที่อยู่ใน .Net 4.5.1 แต่ไม่ได้อยู่ใน netstandard เช่น System.Web การเปลี่ยนเวอร์ชันของ netstandard ที่คุณกำหนดเป้าหมายจะไม่ช่วยอะไร - person svick; 19.05.2016