2010-05-10 15 views
11

desde actualizar mi proyecto a VS2010, incluido el uso de MSBuild v4 en lugar de 3.5 (y no hacer ningún otro cambio), obtengo el siguiente error de compilación y no tengo ni idea de cómo solucionarlo que (log de CC.NET):MSBuild: Error de TlbImp desde actualizar a 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> 

Problema: Un tipo de máquina válido solo compatible con la biblioteca de tipo de entrada debe ser especificado.

Solo se aplica a la versión x64 de mi proyecto, x86 aún funciona bien. Aparentemente, intenta construir un ensamblado de interoperabilidad x64 desde la DLL x86 ubicada en "C: \ Ensambles". Al ejecutar el comando TlbImp con la DLL x64 que se encuentra en un directorio diferente, funciona bien. Sin embargo, no sé cómo puedo configurar mi proyecto para usar diferentes referencias COM para la compilación x86 y x64. El sistema operativo en el que se está compilando el proyecto es WinXP x86. La construcción funcionó bien al usar VS2005 + MSBuild 3.5

Cualquier ayuda sería muy apreciada.

Intenté construir el proyecto actualizado con MSBuild v3.5, pero eso tampoco funciona. Se queja de códigos NoWarn desconocidos (probablemente nuevos en 4.0).

+0

Estoy teniendo este mismo error exacto después de pasar a TFS2010 y VS2010. Construimos todos nuestros proyectos en AnyCPU y no hemos tenido ningún problema al usar CC.NET (excepto cuando usamos específicamente x86 o x64), y ahora lo hacemos con TFS. –

+0

Ahora mencioné eso en MS Connect, veamos qué sucede: http://connect.microsoft.com/VisualStudio/feedback/details/711406/tlbimp-error-since-vs2010-a-single-valid-machine-type-compatible-with-the-input-type-library-must-be-specified – floele

Respuesta

2

Finalmente se me ocurrió la "solución". Como se señaló en MS Connect, el cambio en el comportamiento de compilación x64 aparentemente fue intencional. A partir de VS2010 y posterior, se requiere un sistema de compilación x64 para una compilación x64 de su aplicación, por lo que me vi obligado a actualizar mi sistema de compilación a x64 (lo que básicamente significa reinstalar todo). Luego, para la compilación x64, debe usar la versión x64 de MSBuild, que se encuentra en la carpeta "Framework64" (más detalles en el Visual Studio blog: Building on Cross targeting scenarios and 64-bit MSBuild).

0

Creo que encontrará que esto se debe a que el ensamblado objetivo debe compilarse para el mismo tipo de CPU que la compilación del proyecto.

¿Ha considerado tener 2 proyectos que contienen los mismos archivos y luego consulte las versiones x64/x86 de su ensamblado de destino en ellos?

Puede significar tener abiertas 2 instancias de VS, pero al menos todo lo que necesita hacer es editar y luego cambiar y compilar.

El problema también puede deberse a que está tratando de compilar código de 64 bits en un sistema operativo de 32 bits ... No creo, sin embargo, solo ejecutar el código sería un problema por lo que yo sé.

+0

No puedo hacer referencia al x64 DLL * en absoluto * en el sistema de compilación, porque no es un sistema operativo x64 y, por lo tanto, no se pueden registrar DLL COM x64. – floele

2

Hemos tenido un problema similar con com referencias para x64 (pero diferente mensaje de error), y resultó que el AnyCPU faltaba en el archivo del proyecto (similar al comentario de Adam Driscoll). Esto significaba que la interoperabilidad x86 se estaba utilizando para las compilaciones x86 abd x64.

En el archivo csproj, agregue este nodo debajo de cada nodo. Cuando se crea el proyecto, se crea/utiliza la interoperabilidad independiente de la plataforma.

+0

No puedo usar AnyCPU sin embargo. Necesito una compilación x86 y x64 de mi aplicación. La versión x86 incluye archivos DLL x86, y si los compilara con AnyCPU, se ejecutaría como x64 en los sistemas operativos x64, y no podría cargar los archivos DLL x86 instalados. – floele

+0

No tiene que compilar la aplicación como anycpu, esta etiqueta importará el recurso como anycpu para que funcione tanto en la compilación x86 como x64. – Mahen

+0

Esto no debería funcionar, ya que no utilizo la configuración "AnyCPU" para compilar, y de hecho no funciona. No importa si los AnyCPU-PropertyGroups tienen PlatformTarget o no. – floele

Cuestiones relacionadas