Ich verschiebe ein Projekt von project.json
in das neue csproj-Format und es enthält eine Klasse, die von abgeleitet ist DbParameterCollection
. In meinem eigentlichen Projekt verwende ich Multi-Targeting, aber für die Zwecke dieser Frage müssen wir uns nur darum kümmern net45
.
Der Compiler sagt mir, dass ich drei Eigenschaften überschreiben muss, die ich vorher nicht musste:
Wenn Sie diesen Dokumentationslinks (für .NET 4.5) folgen, werden Sie feststellen, dass alle Eigenschaften virtuell und nicht abstrakt sind. Wenn ich den Code nur durch Aufrufen erstelle, csc
ist alles in Ordnung. Nur wenn ich das .NET Core SDK verwende, stoße ich auf das Problem.
Hier ist ein Beispielcode, um das Problem zu reproduzieren:
Projektdatei:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net45</TargetFramework>
</PropertyGroup>
</Project>
C # -Code:
using System;
using System.Collections;
using System.Data.Common;
public class DummyParameterCollection : DbParameterCollection
{
public override int Count => 0;
public override object SyncRoot => null;
public override void Remove(object value) {}
public override void RemoveAt(int index) {}
public override void RemoveAt(string parameterName) {}
public override int Add(object value) => 0;
public override void Insert(int index, object value) {}
public override void AddRange(Array values) {}
public override void Clear() {}
public override bool Contains(object value) => false;
public override bool Contains(string value) => false;
public override void CopyTo(Array array, int index) {}
public override int IndexOf(object value) => -1;
public override int IndexOf(string parameterName) => -1;
protected override DbParameter GetParameter(int index) => null;
protected override DbParameter GetParameter(string parameterName) => null;
protected override void SetParameter(int index, DbParameter value) {}
protected override void SetParameter(string parameterName, DbParameter value) {}
public override IEnumerator GetEnumerator() => null;
}
Fehler:
DummyParameterCollection.cs (5,14): Fehler CS0534: 'DummyParameterCollection' implementiert das geerbte abstrakte Mitglied 'DbParameterCollection.IsSynchronized.get' nicht [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs (5) 14): Fehler CS0534: 'DummyParameterCollection' implementiert kein geerbtes abstraktes Mitglied 'DbParameterCollection.IsFixedSize.get' [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
DummyParameterCollection.cs (5,14): Fehler CS0534: 'DummyParameterCollection' implementiert kein geerbtes abstraktes Mitglied 'DbParameterCollection.IsReadOnly.get' [c: \ Users \ skeet \ Test \ ParameterCollection \ ParameterCollection.csproj]
Ich glaube, ich kenne die unmittelbare Ursache des Problems, aber nicht die Gründe, warum es so ist, oder die beste Problemumgehung.
Es sieht so aus, als ob das .NET Core SDK (und VS2017 beim Laden dieses Projekts) die Referenzassemblys verwendet. Wenn ich C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll
in Reflector öffne , werden die Eigenschaften ebenfalls als abstrakt angezeigt. Wenn ich dagegen öffne c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
, werden die Eigenschaften als virtuell angezeigt.
Ich kann dies umgehen, indem ich die Eigenschaften überschreibe und einfach false
von allen zurückkehre - aber ist das der beste Weg, um mit dieser Situation umzugehen? Gibt es darüber hinaus einen guten Grund, warum die Referenzbaugruppen in diesem Fall nicht mit den tatsächlichen Baugruppen (und der Dokumentation) übereinstimmen? Ich würde erwarten, dass die Referenzbaugruppen automatisch generiert werden, daher ist es seltsam, dass einige Dinge so falsch sind ...
quelle
abstract
ab v4.5.1 virtuell waren. Warum unterscheiden sie sich? Ich kann nicht sagen, ohne zu raten.virtual
in den inkrementellen Updates nach Version 4.5 in den Referenzassemblys geändert wurden, was auch erklären würde, warum sie in der neuesten Version des Frameworks im Windows-Ordner enthalten sind. Ich verweise (kein Wortspiel beabsichtigt) auf diese Frage stackoverflow.com/questions/9701135/…abstract
ebenfalls. Im .net-Standard ist es auch abstrakt. Die Referenzassembly in CoreFx für System.Data.Common zeigt sie jetzt auch als virtuelles github.com/dotnet/corefx/blame/master/src/System.Data.Common/…project.json
, und dass sie bei unserer Verwendung funktionieren , das ist seltsam ...Antworten:
Die Referenzbaugruppen sind korrekt. In .NET Framework 4.5 waren diese Eigenschaften
abstract
. Sie wurdenvirtual
in .NET Framework 4.5.1 geändert . Anscheinend haben Sie einen Dokumentationsfehler entdeckt.Wie Sie wahrscheinlich bereits vermutet haben, ist der Unterschied zwischen den beiden beobachteten System.Data.dll-Assemblys darauf zurückzuführen, wie .NET Framework Referenzassemblys und Laufzeitassemblys trennt. Die Referenzbaugruppe in
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll
spiegelt genau wider, was in der 4.5-Laufzeitversion von gewesen wäreSystem.Data.dll
. Wenn Sie in der Lage sind, einen alten Computer zu erhalten, der noch nicht auf .NET Framework 4.5.1 aktualisiert wurde (viel Glück), werden Sie feststellen, dass die Laufzeitassembly inC:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
die folgenden Eigenschaften aufweistabstract
. .NET Framework-Upgrades sind vorhanden. Auf einem Computer, der auf .NET Framework 4.5.1 oder höherC:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll
aktualisiert wurde , wurde er durch die aktualisierte Version ersetzt (mitvirtual
nichtabstract
Eigenschaften).In
net451
Bezug auf Problemumgehungen: Kompilieren für oder Implementieren von Dummy-Methoden sind die besten Ansätze. Sie könnten andere Tricks ausführen, um gegen eine andere Version von System.Data.dll zu kompilieren, aber ich würde es nicht empfehlenIch konnte keine offizielle Dokumentation zu den API-Änderungen zwischen .NET Framework 4.5 und 4.5.1 oder eine Erklärung dafür finden, warum dies geändert wurde. Ich fand jedoch diesen Kommentar eines Mitglieds des Entity Framework-Teams: https: // bugzilla. xamarin.com/show_bug.cgi?id=29167#c0 .
quelle
project.json
, aber das ist eine andere Geschichte :)