Alles, was hier geschrieben wurde, ist natürlich korrekt, aber die ursprüngliche Frage wurde noch nicht beantwortet. Theoretisch könnten Sie ein solches Werkzeug selbst schreiben, indem Sie den Code durchlaufen und sehen, ob Sie einen Verweis auf eine Methode finden, die zuerst in diesem SP1 existierte. Hier ist ein grobes Beispiel, die Cecil verwendet die Baugruppe zu analysieren:
namespace SampleNamespace
{
using System;
using Mono.Cecil;
using Mono.Cecil.Cil;
internal static class Program
{
public static void Main(string[] args)
{
foreach (string arg in args)
{
Console.WriteLine("{0}: {1}", arg, NeedsDotNet35SP1(arg));
Console.ReadLine();
}
}
private static bool NeedsDotNet35SP1(string fileName)
{
return NeedsDotNet35SP1(ModuleDefinition.ReadModule(fileName));
}
private static bool NeedsDotNet35SP1(ModuleDefinition module)
{
if (TargetRuntime.Net_2_0 != module.Runtime)
{
// I don't care about .NET 1.0, 1.1. or 4.0 for this example.
return false;
}
foreach (TypeDefinition type in module.Types)
{
if (NeedsDotNet35SP1(type))
{
return true;
}
}
return false;
}
private static bool NeedsDotNet35SP1(TypeDefinition type)
{
foreach (MethodDefinition method in type.Methods)
{
if (NeedsDotNet35SP1(method))
{
return true;
}
}
return false;
}
private static bool NeedsDotNet35SP1(MethodDefinition method)
{
return NeedsDotNet35SP1(method.Body);
}
private static bool NeedsDotNet35SP1(MethodBody body)
{
foreach (Instruction instruction in body.Instructions)
{
if (NeedsDotNet35SP1(instruction))
{
return true;
}
}
return false;
}
private static bool NeedsDotNet35SP1(Instruction instruction)
{
if (OperandType.InlineMethod != instruction.OpCode.OperandType)
{
return false;
}
return NeedsDotNet35SP1((MethodReference)instruction.Operand);
}
private static bool NeedsDotNet35SP1(MethodReference method)
{
return method.FullName.Equals(
"System.Boolean System.Threading.WaitHandle::WaitOne(System.Int32)",
StringComparison.OrdinalIgnoreCase);
}
}
}
Offensichtlich ist dieses Beispiel nimmt nur, dass ein Verfahren in Betracht, aber es sollte möglich sein, auf sie zu erweitern, wenn Sie wirklich brauchen. :)
Microsoft vermasselte, dass sie Methoden zu Mscorlib-Klassen hinzugefügt, aber die [AssemblyVersion] nicht geändert haben. Sie haben diese Lektion gelernt und spezifische Gegenmaßnahmen gegen diesen Fehler in .NET 4 ergriffen. Sie können wirklich nichts tun, außer sicherzustellen, dass die richtige Version von .NET bereitgestellt wird. Bei einem Setup-Projekt, wenn Sie Ihre Voraussetzungen nicht gut genug kommunizieren können. Einfach zu erledigen. –
Ich denke, ein anderes Szenario, in dem mir das passiert, ist, dass ich Code schreibe, aber ich merke nicht, dass ich Methoden verwende, die nicht funktionieren, wenn ich den Code auf eine andere Plattform (XBOX oder WP7) übertragen möchte. Ich verwende Methoden und Klassen, die nicht portierbar sind - aber zumindest warnt mich der Compiler davor. –