Desajuste del tiempo de ejecución de AxImp .NET4.0

Tengo un problema con la compilación de una aplicación C#/WPF usando MSBuild.

El problema es el siguiente. Creé un proyecto de Visual Studio 2010 con una aplicación WPF predeterminada. Creé un control de usuario de Windows Forms "anticuado" que muestro usando el control. Lo único que hace este control de usuario es mostrar un documento PDF utilizando el control ActiveX de Adobe Reader (con AcroPDFLib).

Esto se compila perfectamente en mi máquina local que tiene instalado Windows 7 (64 bits) y VS2010 usando el siguiente comando.

>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe AcroPDFTest.sln /p:Configuration=Debug /t:Rebuild /verbosity:d

Sin embargo, falla si lo compilo de la misma manera en nuestra máquina de compilación, que es una máquina con Windows Server 2008 R2 con Windows SDK 7.1. Luego aparece el siguiente error (incluida la salida detallada):

Using "ResolveComReference" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "ResolveComReference"
  Creating new cache file at "obj\x86\Debug\AcroPDFTest.csproj.ResolveComReference.cache".
  Resolving COM reference for item "AcroPDFLib" with a wrapper "tlbimp".
  Determining dependencies of the COM reference "AcroPDFLib".
  Resolving COM reference dependency "00020430-0000-0000-c000-000000000046" version 2.0.
  Resolved COM reference dependency "00020430-0000-0000-c000-000000000046" version 2.0: "obj\x86\Debug\Interop.stdole.dll"
  Type '_IAcroAXDocShimEvents' imported.
  Type 'AcroPDF' imported.
  Type 'IAcroAXDocShim' imported.
  Type 'AdobeSPOpenDocuments' imported.
  Type 'ISPOpenDocuments' imported.
  Resolved COM reference for item "AcroPDFLib": "obj\x86\Debug\Interop.AcroPDFLib.dll".
  Resolving COM reference for item "AxAcroPDFLib" with a wrapper "aximp".
  Determining dependencies of the COM reference "AxAcroPDFLib".
  C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\AxImp.exe "C:\Program Files (x86)\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll" /out:obj\x86\Debug\AxInterop.AcroPDFLib.dll /rcw:obj\x86\Debug\Interop.AcroPDFLib.dll 
AXIMP : AxImp error : The assembly '[snip]\obj\x86\Debug\Interop.AcroPDFLib.dll' failed to load with this error: Could not load file or assembly 'file:///[snip]\obj\x86\Debug\Interop.AcroPDFLib.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.. [[snip]\AcroPDFTest.csproj]
  The command exited with code -1163019603.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1558,9): warning MSB3283: Cannot find wrapper assembly for type library "AxAcroPDFLib". [[snip]\AcroPDFTest.csproj]
Done executing task "ResolveComReference" -- FAILED.

Como puede ver, la herramienta AxImp.exe no acepta el Interop.AcroPDFLib.dll generado en tiempo de compilación debido a una discrepancia en el tiempo de ejecución. Investigué esto más a fondo y la versión de AxImp.exe que se usa aquí usa el tiempo de ejecución .NET 2.0, mientras que el archivo Interop.AcroPDFLib.dll usa .NET 4.0:

>"C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\AxImp.exe" /?
Microsoft (R) .NET ActiveX Control to Windows Forms Assembly Generator
[Microsoft .Net Framework, Version 2.0.50727.5456]
Copyright (c) Microsoft Corporation.  All rights reserved.

Para completar, si ejecuto esto en mi máquina, obtengo el siguiente resultado (detallado):

Using "ResolveComReference" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "ResolveComReference"
  Creating new cache file at "obj\x86\Debug\AcroPDFTest.csproj.ResolveComReference.cache".
  Resolving COM reference for item "AcroPDFLib" with a wrapper "tlbimp".
  Determining dependencies of the COM reference "AcroPDFLib".
  Resolving COM reference dependency "00020430-0000-0000-c000-000000000046" version 2.0.
  Resolved COM reference dependency "00020430-0000-0000-c000-000000000046" version 2.0: "C:\Windows\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll"
  Type '_IAcroAXDocShimEvents' imported.
  Type 'AcroPDF' imported.
  Type 'IAcroAXDocShim' imported.
  Type 'AdobeSPOpenDocuments' imported.
  Type 'ISPOpenDocuments' imported.
  Resolved COM reference for item "AcroPDFLib": "obj\x86\Debug\Interop.AcroPDFLib.dll".
  Resolving COM reference for item "AxAcroPDFLib" with a wrapper "aximp".
  Determining dependencies of the COM reference "AxAcroPDFLib".
  C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\AxImp.exe "C:\Program Files (x86)\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll" /out:obj\x86\Debug\AxInterop.AcroPDFLib.dll /rcw:obj\x86\Debug\Interop.AcroPDFLib.dll 
  Generated Assembly: [snip]\obj\x86\Debug\AxInterop.AcroPDFLib.dll
  Resolved COM reference for item "AxAcroPDFLib": "obj\x86\Debug\AxInterop.AcroPDFLib.dll".
Done executing task "ResolveComReference".

Aquí la ruta de AxImp.exe es diferente, y esta versión usa el tiempo de ejecución .NET 4.0:

>"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\AxImp.exe" /?
Microsoft (R) .NET ActiveX Control to Windows Forms Assembly Generator
[Microsoft .Net Framework, Version 4.0.30319.269]
Copyright (c) Microsoft Corporation.  All rights reserved.

Entonces mi pregunta es: ¿Cómo puedo obligar a MSBuild a usar la versión 4.0 de AxImp en lugar de la versión 2.0?

preguntado el 22 de mayo de 12 a las 14:05

2 Respuestas

Encontré una solución a este problema.

Debe especificar qué versión de SDK debe usar MSBuild. Si agrega el siguiente parámetro de línea de comando adicional, funcionará (al menos en mi situación).

/p:WindowsSDKVersionOverride=v7.1

Aparentemente, MSBuild intenta usar la versión v7.0A de forma predeterminada, que no está instalada en mi servidor de compilación. De alguna manera, decide simplemente ignorar todo y volver a las rutas de .NET 2.0. Descubrí esto eliminando la versión 2.0 de AxImp. Luego se queja de lo siguiente:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1558,9): error MSB3091: Task failed because "AxImp.exe" was not found, or the correct Microsoft Windows SDK is not installed. The task is looking for "AxImp.exe" in the "bin" subdirectory beneath the location specified in the InstallationFolder value of the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A. You may be able to solve the problem by doing one of the following: 1) Install the Microsoft Windows SDK. 2) Install Visual Studio 2010. 3) Manually set the above registry key to the correct location. 4) Pass the correct location into the "ToolPath" parameter of the task.

Esa clave de registro no está presente en mi servidor de compilación. Entonces, si agrega la anulación de la versión v7.1, buscará las claves de registro correctas y usará las versiones correctas de la herramienta.

contestado el 23 de mayo de 12 a las 09:05

Inicio + Todos los programas + Microsoft Windows SDK v7.1 + Visual Studio Integration + Herramienta de configuración de Windows SDK. - Hans Passant

Eso no funciona si no tiene instalado Visual Studio. Incluso da el mensaje de error. Your system does not have Visual Studio 2005 or Visual Studio 2008 installed.. - ralph schiedon

No es un problema de licencia. Solo quiero un servidor de compilación delgado. Windows SDK debería ser suficiente para compilar aplicaciones de Windows. No necesito un IDE en mi servidor. - ralph schiedon

Resolví mi problema instalando SDK de Windows 8.1

En mi caso, estaba tratando de compilar un .csproj usar MSBuild en un CI De Windows 2012 R2 server (CI significa Continuous Integration), aunque las webs más relevantes sobre este tema sugerían instalar Windows SDK, no pudieron señalar EXACTAMENTE cuál.

Entonces, al principio, supuse que se referían a SDK de Windows 10, que también es la versión adecuada para Windows 2012 servidor. Desafortunadamente, SDK de Windows 10 no incluye los faltantes AxImp.exe archivo SDK. Entonces, como puedes imaginar, me tomó bastante tiempo darme cuenta de que SDK de Windows 8.1 era la clave de este acertijo.

Nuevamente, espero que ayude a alguien más ;-)

Respondido 08 Oct 16, 01:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.