2009-08-13 4 views
27

Ich versuche VS08SP1 Standard-Projektsystem zu verwenden, um eine C# kompilieren im expliziten x64-Modus (im Gegensatz zu AnyCpu). Wenn ich explizit ein Modul als x64 markieren, erhalte ich ein:MSBUILD/csc: sauberste Art der Behandlung x64 mscorlib Warnung 1607

Warnung CS1607: Generation Assembly - referenzierte Assembly ‚mscorlib.dll‘ zielt auf einen anderen Prozessor

Eine Möglichkeit, zu entfernen, die mit a /nowarn:1607. Based on my research, gibt es in der Praxis keine Probleme damit. Wenn jemand ein reales Problem, auf das er gestoßen ist, hinterfragen kann, können Sie gerne antworten.

Allerdings fühlt sich das einfach falsch an! So ein anderer Ansatz, den ich verwendet wurde, war /nostdlib+, zu tun und dann eine <Reference> mit einem fest codierten <HintPath> auf die explizit 64 Bit mscorlib hinzufügen:

<Reference Include="mscorlib"> 
    <HintPath>$(windir)\Microsoft.NET\Framework64\v2.0.50727\mscorlib.dll</HintPath> 
</Reference> 

Das funktioniert und ist wahrscheinlich besser (es sei denn, jemand kümmert sich Gründe, darauf hinzuweisen, warum die vorherige Ansatz ist besser), aber kann jemand bestätigen, dass dies eine angemessene Sache zu tun ist, hoffentlich zitiert etwas Authorative?

+0

Ich bin auf das gleiche Problem. Wäre an der Lösung interessiert. Vielen Dank. – decasteljau

Antwort

5

Ich habe gefunden, indem ich das Target-Framework meines Projekts in .NET Framework 4 änderte, löschte die Warnung.

+1

+1 Aber der Wechsel zu einer anderen CLR und VS ist Betrug: P (Serioulsy, danke, dass du dir die Zeit genommen hast zu antworten) –

+0

Endlich akzeptierend - Während dies die eigentliche Frage nicht beantwortet, ist dies die Lösung, die ich am Ende benutzt habe, und ich denke, es ist ziemlich genau die idiomatische "Antwort" in diesem Ökosystem ... –

+2

Dies ist keine Lösung für das Problem in keiner Weise. Es mag für Sie Todd geklappt haben, aber viele Projekte können nicht einfach geändert werden, um auf einen anderen Rahmen zu zielen. – xxbbcc

3

Ich glaube, Ihre zweite Option (expliziter Verweis mit /nostdlib+) ist besser, weil diese Warnung nicht unterdrückt wird, wenn Sie auf andere Baugruppen verweisen, die nicht auf derselben Plattform erstellt wurden.

+0

+1 einsichtsvoll (zuerst gelesen, ich war mir nicht sicher). Ich zögere zu akzeptieren, dass ich mich an meine Wählerbewertung halten soll: P: Ernsthaft: Ich bin daran interessiert, Negativpunkte meiner zweiten Herangehensweise zu hören - Sie würden denken, dass es von VS in Verzug geraten würde, wenn es keine Nachteile gibt. Aber ich denke, aus einer 'msbuild'-Perspektive macht es viel Sinn, und' csc' sollte nicht all diese Richtlinie direkt in das Tool eingebaut haben. –

+1

Ich kann mir keine Nachteile vorstellen, es sei denn, Sie kompilieren auf einer x86-Box Das hat möglicherweise nicht die Assembly auf diesem Pfad. –

+0

Soweit Msbuild betroffen ist (wirklich Teambuild), würde ich es vorziehen, jede Plattform auf dieser Plattform zu betreiben. –

9

In this blog ich einen Vorschlag gefunden, die zu lang ist, es zu kopieren ganz hier vorbei, aber kurz gesagt kann die Idee mit Zusammenfassung von this comment angepasst beschrieben werden:

In der Projektdatei können Sie eine benutzerdefinierte Variable definieren im Abschnitt PropertyGroup für jede Build-Konfiguration. Beispiel:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> 
    <MyCustomPath>C:\Windows\Microsoft.NET\Framework64</MyCustomPath> 
</PropertyGroup> 

Fügen Sie einfach einen Tag wie

<Reference Include="System.Data"> 
    <HintPath>$(MyCustomPath)</HintPath> 
</Reference> 

und dann das Makro verwenden, um die Referenzstrecke festlegen. Sie können MyCustomPath an einem anderen Speicherort für verschiedene Buildkonfigurationen (Plattform und/oder Debug/Release) definieren.
Das Problem würde nicht existieren, wenn MS dies in der VS UI unterstützen würde, aber bis dahin wird dies funktionieren. Ich verwende diese Technik, um verschiedene Versionen derselben Assemblys in meinen Debug-Release-Builds & zu referenzieren. Funktioniert super!

In der obigen Rezitation habe ich das Tag wiedergefunden, das im Quellkommentarium verloren gegangen war und den Wortlaut geändert, um etwas detaillierter zu sein.


Ein weiteres interessantes Stück aus den same blog:

Es gibt einige andere Möglichkeiten, dies zu tun, aber sie erfordern auch eine manuell die Projektdateien zu bearbeiten.Eine Möglichkeit besteht darin, Bedingungen für PropertyGroup-Abschnitte anzugeben. Diese StackOverflow Frage unterstreicht die Verwendung von Bedingungen.

+0

+1 In meinem Szenario brauche ich nicht wirklich diese Technik - ich will immer 'x64'. Lassen Sie die Frage immer noch nicht akzeptiert - ich würde gerne wissen, was Microsoft als einen Weg empfehlen würde, einen eingebauten Fehler zu behandeln (ohne ihre schreckliche Forum-Software zu tolerieren: P) –

0

In meinem Fall hatte ich diese Warnung, weil ich eine Mischung aus x86 und x64-Projekten in meiner Lösung hatte. Wenn ich in allen meinen Projekten x86-Buildkonfigurationen erzeuge und diese für den Build anvisiere, verschwinden die Warnungen. Wenn ich jedoch x64 insgesamt anvisieren wollte, müsste ich das Projekt (oder den obigen Ratschlag) neu erstellen, um sie für das x64-Framework zu überarbeiten.