2015-03-23 4 views
4

J'utilise csc/csc2.exe pour compiler manuellement une application. J'ai besoin de référencer .NET 3.5 dlls, cependant il semble que le compilateur ajoute automatiquement .NET 4.0 dlls (ce qui provoque un conflit).Compilation manuelle de C# en ciblant .NET 3.5 avec Roslyn (csc.exe)

Je référence manuellement la version souhaitée de mscorlib et d'autres DLL système. La compilation à partir de Visual Studio réussit, mais la compilation du même fichier de réponses manuellement à partir de l'invite de commande échoue.

/nostdlib+ 
/platform:AnyCPU 
/errorendlocation 
/highentropyva- 
/reference:"C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll" 
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" 
/reference:"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll" 
/debug+ 
/debug:full 
/out:obj\Debug\Target.exe 
/ruleset:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset" 
/target:exe 
/utf8output 
Program.cs Properties\AssemblyInfo.cs 

Je reçois les erreurs suivantes pour chaque assemblage référencé:

error CS1703: Multiple assemblies with equivalent identity have been imported: 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.dll' and 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll'. Remove one of the duplicate references. 

Quelles sont les causes du compilateur pour .NET 4.0 dll comprennent, et que puis-je faire pour l'empêcher de les inclure?

MISE À JOUR: Je ne peux pas utiliser MSBUILD, parce que je l'ai déjà un fichier de réponse (pas un fichier de projet) à partir d'une application. L'application utilisait une version obsolète d'un compilateur, et j'essaye de remplacer leur compilateur par un plus récent qui supporte le C# 6. J'ai réussi cette tâche avec le compilateur Mono MCS, mais je ne peux pas obtenir la même chose avec Roslyn. Je ne peux pas utiliser le compilateur MCS, car il ne prend pas encore en charge toutes les fonctionnalités C# 6. La seule façon d'utiliser MSBUILD serait d'analyser le fichier de réponse dans un fichier projet C#. Cela me semble être une sur-ingénierie.

+2

curiosité: Pourquoi utilisez-vous 'csc2.exe' et non MSBuild si elle se construit bien dans Visual Studio? – ChrFin

+0

J'ai une application qui utilise un compilateur C# obsolète. L'application produit un fichier de réponse, et j'essaie de l'utiliser avec un compilateur plus récent. –

+0

Pouvez-vous mettre à jour votre question et expliquer cela plus en détail? Je suis assez certain qu'il existe une meilleure solution soit en utilisant MSBuild (BTW: MSBuild est open-source maintenant!) Ou 'CodeDom' ... – ChrFin

Répondre

7

Ajoutez l'option /noconfig à la ligne de commande et cela devrait fonctionner comme prévu.

option/noconfig indique au compilateur de ne pas compiler avec le fichier de csc.rsp, qui est situé à l'intérieur et chargé à partir du même répertoire que le fichier csc.exe.

Le fichier csc.rsp référence tous les assemblys livrés avec le Framework .NET . Les références réelles que l'environnement de développement Visual Studio .NET inclut dépendent du type de projet.

Source

contenu habituel de csc.rps (v4.0.30319):

/r:Accessibility.dll 
/r:Microsoft.CSharp.dll 
/r:System.Configuration.dll 
/r:System.Configuration.Install.dll 
/r:System.Core.dll 
/r:System.Data.dll 
/r:System.Data.DataSetExtensions.dll 
/r:System.Data.Linq.dll 
/r:System.Data.OracleClient.dll 
/r:System.Deployment.dll 
/r:System.Design.dll 
/r:System.DirectoryServices.dll 
/r:System.dll 
/r:System.Drawing.Design.dll 
/r:System.Drawing.dll 
/r:System.EnterpriseServices.dll 
/r:System.Management.dll 
/r:System.Messaging.dll 
/r:System.Runtime.Remoting.dll 
/r:System.Runtime.Serialization.dll 
/r:System.Runtime.Serialization.Formatters.Soap.dll 
/r:System.Security.dll 
/r:System.ServiceModel.dll 
/r:System.ServiceModel.Web.dll 
/r:System.ServiceProcess.dll 
/r:System.Transactions.dll 
/r:System.Web.dll 
/r:System.Web.Extensions.Design.dll 
/r:System.Web.Extensions.dll 
/r:System.Web.Mobile.dll 
/r:System.Web.RegularExpressions.dll 
/r:System.Web.Services.dll 
/r:System.Windows.Forms.Dll 
/r:System.Workflow.Activities.dll 
/r:System.Workflow.ComponentModel.dll 
/r:System.Workflow.Runtime.dll 
/r:System.Xml.dll 
/r:System.Xml.Linq.dll 
+0

Merci, c'est exactement ce que je cherchais! Il est intéressant d'ajouter que l'option/noconfig du fichier de réponses ne fait rien, mais l'ajouter à la ligne de commande fait l'affaire. –