2010-05-10 4 views
11

depuis la mise à niveau de mon projet vers VS2010, y compris l'utilisation de MSBuild v4 au lieu de 3.5 (et pas d'autres modifications), j'obtiens l'erreur de compilation suivante et je n'ai aucune idée il (log de CC.NET):MSBuild: erreur TlbImp depuis la mise à niveau vers VS 2010

<target name="ResolveComReferences" success="false"> 
    <message level="high"><![CDATA[C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe c:\Assemblies\NMSDVDXU.dll /namespace:NMSDVDXLib /machine:X64 /out:obj\x64\Release\Interop.NMSDVDXLib.dll /sysarray /transform:DispRet /reference:c:\Assemblies\Bass.Net.dll /reference:c:\Assemblies\LogicNP.FileView.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll ]]></message> 
    <error code="TI0000" file="TlbImp"><![CDATA[A single valid machine type compatible with the input type library must be specified.]]></error> 
    <warning code="MSB3283" file="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" line="1558" column="9"><![CDATA[Die Wrapperassembly für die Typbibliothek "NMSDVDXLib" wurde nicht gefunden.]]></warning> 
    <message level="high"><![CDATA[C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe c:\Assemblies\StarBurnX12.dll /namespace:RocketDivision.StarBurnX /machine:X64 /out:obj\x64\Release\Interop.RocketDivision.StarBurnX.dll /sysarray /transform:DispRet /reference:c:\Assemblies\Bass.Net.dll /reference:c:\Assemblies\LogicNP.FileView.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll ]]></message> 
    <error code="TI0000" file="TlbImp"><![CDATA[A single valid machine type compatible with the input type library must be specified.]]></error> 
    <warning code="MSB3283" file="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" line="1558" column="9"><![CDATA[Die Wrapperassembly für die Typbibliothek "RocketDivision.StarBurnX" wurde nicht gefunden.]]></warning> 
    </target> 

problème: Un type de machine valide unique compatible avec la bibliothèque de type d'entrée doit être spécifiée.

Cela ne s'applique qu'à la version x64 de mon projet, x86 fonctionne toujours correctement. Apparemment, il essaie de construire un assembly d'interopérabilité x64 à partir de la DLL x86 située dans "C: \ Assemblies". Lors de l'exécution de la commande TlbImp avec la DLL x64 qui se trouve dans un répertoire différent, cela fonctionne correctement. Cependant, je ne sais pas comment je peux configurer mon projet pour utiliser différentes références COM pour la construction x86 et x64. Le système d'exploitation sur lequel le projet est compilé est WinXP x86. Le bâtiment a bien fonctionné lors de l'utilisation VS2005 + MSBuild 3.5

Toute aide serait grandement appréciée.

J'ai essayé de créer le projet mis à niveau avec MSBuild v3.5, mais cela ne fonctionne pas non plus. Il se plaint des codes NoWarn inconnus (probablement nouveau dans 4.0).

+0

J'ai exactement la même erreur après le passage à TFS2010 et VS2010. Nous construisons tous nos projets dans AnyCPU et n'avons pas eu de problèmes avec CC.NET (sauf en utilisant spécifiquement x86 ou x64), et maintenant avec TFS. –

+0

L'ai maintenant mis en place sur MS Connect, voyons ce qui se passe: http://connect.microsoft.com/VisualStudio/commentaires/détails/711406/tlbimp-error-since-vs2010-a-single-valid-machine-type-compatible-with-the-input-type-bibliothèque-doit-être-spécifié – floele

Répondre

2

J'ai finalement trouvé la "solution". Comme indiqué sur MS Connect, la modification du comportement de construction x64 était intentionnelle apparemment. À partir de VS2010 et plus tard, un système de compilation x64 est requis pour une version x64 de votre application, donc j'ai été forcé de mettre à jour mon système de compilation vers x64 (ce qui signifie essentiellement réinstaller tout). Ensuite, pour la version x64, vous devez utiliser la version x64 de MSBuild, qui se trouve dans le dossier "Framework64" (plus de détails sur le Visual Studio blog: Building on Cross targeting scenarios and 64-bit MSBuild).

0

Je pense que vous trouverez cela parce que l'assembly ciblé doit être compilé pour le même type de CPU que la construction du projet.

Avez-vous envisagé d'avoir 2 projets qui contiennent les mêmes fichiers, puis de vous référer aux versions x64/x86 de votre assembly cible?

Cela peut vouloir dire avoir 2 instances de VS ouvertes mais au moins tout ce que vous devez faire est d'éditer puis de passer et de construire. Le problème peut aussi être parce que vous essayez de construire du code 64 bits sur un système d'exploitation 32 bits ... Je ne pense pas si, seulement exécuter le code serait un problème autant que je sache.

+0

Je ne peux pas référencer le x64 DLL * du tout * sur le système du compilateur, car ce n'est pas un système d'exploitation x64 et donc aucune DLL COM x64 ne peut être enregistrée. – floele

2

Nous avons eu un problème similaire avec com références pour x64 (mais message d'erreur différent), et il s'est avéré que le AnyCPU manquait sur le fichier de projet (semblable au commentaire d'Adam Driscoll). Cela signifiait que l'interopérabilité x86 était utilisée pour les deux build x86 abd x64.

Dans le fichier csproj, ajoutez ce noeud sous chaque noeud. Lorsque le projet est construit, l'interopérabilité de la plate-forme est créée/utilisée.

+0

Je ne peux pas utiliser AnyCPU si. J'ai besoin d'une version x86 et x64 de mon application. La version x86 est livrée avec des DLL x86, et si je la compilais avec AnyCPU, elle fonctionnerait comme x64 sur les systèmes d'exploitation x64, ne pouvant pas charger les DLL x86 installées. – floele

+0

Vous n'avez pas à compiler l'application en tant que anycpu, cette balise importera la ressource en tant que anycpu afin qu'elle fonctionne à la fois dans les versions x86 et x64. – Mahen

+0

Cela ne devrait pas fonctionner, puisque je n'utilise pas la config "AnyCPU" pour la compilation, et cela ne fonctionne pas en fait. Peu importe que les AnyCPU-PropertyGroup aient ou non un PlatformTarget. – floele

Questions connexes