Resolver MSB3247 - conflictos Encontrado entre diferentes versiones de un mismo conjunto dependiente

StackOverflow https://stackoverflow.com/questions/1871073

  •  18-09-2019
  •  | 
  •  

Pregunta

Una solución .NET 3.5 terminó con esta advertencia al compilar con msbuild.

A veces NDepend podría ayudar a cabo, pero en este caso no dio más detalles. como Bob Acabé tener que recurrir a la apertura de cada conjunto de ILDASM hasta que encontré el que se refería a una versión anterior del ensamblado dependiente.

Yo probé usando MSBUILD de VS 2010 Beta 2 (como el artículo Conectar indicó que este se fija en la próxima versión del CLR), pero que no proporcionó más detalles o bien (quizás fijo posterior Beta 2)

¿Hay un mejor enfoque (más automatizado)?

¿Fue útil?

Solución

Cambiar el "nivel de detalle de resultados de generación de proyecto MSBuild" a "detallada" o superior. Para ello, siga estos pasos:

  1. abrir el cuadro de diálogo Opciones. ( Herramientas -> Opciones ... )
  2. En el árbol de la izquierda, seleccione el Proyectos y soluciones nodo y, a continuación, seleccione crear y ejecutar .
    • . Nota: si el nodo no aparece, asegúrese de que la casilla de verificación en la parte inferior del cuadro de diálogo Mostrar todos los ajustes se comprueba
  3. En la página Herramientas / Opciones que aparece, defina MSBuild resultados de generación de proyectos verbosidad nivel en el valor adecuado dependiendo de la versión:

  4. Generar el proyecto y buscar en la ventana de salida.

Consulte los mensajes de MSBuild. La tarea ResolveAssemblyReferences, que es la tarea de la que se origina MSB3247, debe ayudarle a depurar este tema en particular.

Mi caso concreto ha sido una referencia incorrecta a SqlServerCe. Vea abajo. Tenía dos proyectos que hacen referencia a dos versiones diferentes de SqlServerCe. Fui al proyecto con la versión anterior, eliminado la referencia, a continuación, añade la referencia correcta.

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

Usted no tiene que abrir cada asamblea para determinar las versiones de ensamblados de referencia.

  • Usted puede comprobar las propiedades de cada referencia.
  • Abra las propiedades del proyecto y comprobar las versiones de la sección de referencias.
  • Abre los proyectos con un editor de texto.
  • Uso .Net reflector.

Otros consejos

publicado una pequeña aplicación de consola llamada AsmSpy que más bien enumera las referencias de cada montaje:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

Esta es una manera mucho más rápida para llegar a la parte inferior de la MSB3247 advertencia, que depender de la salida de MSBuild.

En algún momento @AMissico respuesta no es suficiente. En mi caso, no he podido encontrar el error en las ventanas de salida, así que decidí crear un archivo de registro y analizarlo, al hacer los siguientes pasos:

  1. Guardar el registro de generación de un archivo ... https: / /msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. Para el texto: warning MS... o la información de advertencia específica: (línea 9293 por ejemplo) Found conflicts between different versions... y el detalle completo del error de conflicto estará por encima de este mensaje (por ejemplo, la línea 9277) There was a conflicts between... Encontrar el mensaje de error

Visual Studio 2013

He encontrado que (al menos en Visual Studio 2010) es necesario establecer el nivel de detalle de salida de al menos detallada que sea capaz de detectar el problema.

Puede ser que mi problema era una referencia que antes era una referencia GAC, pero que ya no era el caso después de reinstalación de mi máquina.

Esta advertencia generada por defecto ASP.NET MVC 4 beta ver aquí

  

En cualquier elenco de esta advertencia puede ser eliminado mediante la edición manual del   .csproj para su proyecto.

     

modificar ........: Referencia Incluir = "System.Net.Http"

     

para leer ......: Incluir referencia = "System.Net.Http, versión = 4.0.0.0"

Yo tenía el mismo error y no podía dar con las otras respuestas. He descubierto que podemos "Consolidar" paquetes NuGet.

  1. Haga clic derecho sobre la solución
  2. Haga clic en Administrar paquetes Nuget
  3. y actualización de la misma versión Consolidar.

Utilice un lector de dependencia

dep.exe puede listar todas las dependencias anidadas de una carpeta entera. En combinación con las herramientas de UNIX como grep o awk, puede ayudar a resolver su problema

Encontrando asambleas que se hace referencia en más de una versión

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

Esta línea de comandos ejecuta oscura dep.exe entonces tubos la salida dos veces para awk a

  • puso el padre e hijo en una sola columna (por defecto cada línea contiene un padre y un hijo para expresar el hecho de que esta matriz depende de ese niño)
  • luego hacer una especie de 'grupo por' usando una matriz asociativa

La comprensión de cómo esta asamblea quedó tirado en la papelera

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

En este ejemplo, la herramienta podría mostrar que System.Web.Http 5.2.3 viene de su dependencia a FooLib mientras que la versión 4.0.0 viene de BarLib.

A continuación, usted tiene la posibilidad de elegir entre

  • convencer a los propietarios de las librerías de utilizar la misma versión
  • dejar de usar uno de ellos
  • añadir redirecciones vinculantes en su archivo de configuración para usar la versión más reciente

Cómo ejecutar estas cosas en Windows

Si usted no tiene una cáscara de tipo UNIX que tendrá que descargar uno antes de poder ejecutar awk grepand. Pruebe uno de los siguientes

he tenido este problema también y utilicé el consejo de AMissico también descubrir el problema (Aunque tuvo que ajustar el nivel de verbosidad detallado.

El problema era en realidad bastante sencillo, aunque después de encontrar el culpable.

Antecedentes: He actualizado mi proyecto de VS2008 a VS2010. En el marco de destino VS2008 fue de 3,5 y cuando lo traje en VS2010 me conectó a 4 (completa). También he actualizado algunos componentes de terceros, incluidos informes de Crystal.

Resultó que la mayor parte de las referencias del sistema donde apunta a la versión 4.0.0.0, pero la pareja no había sido cambiado de forma automática (Sistema y System.Web.Services) y todavía estaban mirando 2.0.0.0. Crystal Reports hace referencia 4.0.0.0 y así que fue donde se occuring los conflictos. Basta con poner el cursor en la primera biblioteca del sistema en el explorador de soluciones, el cursor por la lista y buscar cualquier referencia a 2.0.0.0, eliminar y volver a agregar más reciente versión 4.0.0.0 resolvieron el problema.

La extraña esto fue que la mayoría de las referencias habían sido actualizado correctamente y si no fuera por informes de Crystal, que probablemente nunca se había dado cuenta ...

Hice una aplicación basada en aplicación Mike Hadlow: AsmSpy .

Mi aplicación es una aplicación de WPF con interfaz gráfica de usuario y se puede descargar desde mi casa servidor web: AsmSpyPlus. exe .

Código está disponible en: GitHub

Gui de ejemplo

Como se mencionó aquí , es necesario eliminar las referencias utilizadas y las advertencias a ir.

gerente de ASP.NET de construcción es la construcción de la página web por ir a través de las carpetas en orden alfabético, y para cada carpeta en la que se da cuenta de que las dependencias y construye las dependencias primero y luego la carpeta seleccionada.

En este caso la carpeta problemática que es ~ / Controles, se selecciona para ser construido en un principio, de todavía una razón desconocida, se construye algunos de los controles allí como un conjunto independiente en lugar de en el interior de la misma Asamblea que otros controles (parece estar conectado con el hecho de que algunos controles dependen de otros controles en la misma carpeta).

A continuación, la siguiente carpeta que se construye (~ / Archivo-Centro / Control) es dependiente de la carpeta raíz ~ / que depende de ~ / controles, lo que la carpeta ~ / controles se está construyendo de nuevo sólo que esta vez los controles que se separaron a su propio conjunto de ahora están unidos a la misma Asamblea que otros controles con el conjunto separados todavía se hace referencia.

Así que en este punto de agrupamiento, 2 (al menos) tienen los mismos controles y la generación falla.

A pesar de que todavía no sabemos por qué sucedió esto, hemos sido capaces de trabajar alrededor de ella, cambiando el nombre de la carpeta Controles a ZControls, de esta manera no se construye antes de ~ / Archivo-Centro / control, sólo después, y de esta manera se construye como debiera.

Quick Fix:

clic derecho en la solución -> Administrar paquetes NuGet para la solución -> En Consolidar se puede ver si hay diferentes versiones de un mismo paquete se instalaron. Desinstalar diferentes versiones e instalar la más reciente.

A veces AutoGenerateBindingRedirects no es suficiente (incluso con GenerateBindingRedirectsOutputType ). Buscar todos los registros There was a conflict y fijar manualmente uno por uno puede ser tedioso, por lo que escribió un pequeño trozo de código que analiza la salida del registro y los genera para usted (a vertederos stdout):

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

Consejo: usar MSBuild binario y estructurado Visor de registro de y sólo generar redirecciones vinculantes para los conflictos en el proyecto que emite el aviso (es decir, solamente más allá de esas líneas there was a conflict en el archivo de texto de entrada para el código anterior [AssemblyConflicts.txt]).

A forma más sencilla sin sin uno teniendo en cuenta de dependencias (interno):

  1. Abrir "Explorador de soluciones".
  2. Haga clic en "Mostrar todos los archivos"
  3. Ampliar "Referencias"
  4. Usted verá una (o más) de referencia (s) con un poco diferente que el resto del icono. Por lo general, está con la caja amarilla que sugiere que tome nota de ello. Basta con retirar la misma.
  5. Añadir la referencia hacia atrás y compilar el código.
  6. Eso es todo.

En mi caso, había un problema con la referencia de MySQL. De alguna manera, podría enumerar tres versiones de él en la lista de todas las referencias disponibles. Seguí proceso de 1 a 6 anteriores y ha funcionado para mí.

Visual Studio para Mac Además Comunidad:

de AMissico respuesta requiere cambiar el nivel de registro, y tampoco ASMSpy ni ASMSpyPlus están disponibles como una solución multi-plataforma, He aquí una breve además para Visual Studio para Mac:

  

https://docs.microsoft.com/en -us / VisualStudio / mac / y el fomento de la compilación

Está en Visual Studio Comunidad → Preferencias ... → Proyectos → Construir Registro → verbosidad

Si usted tiene ReSharper, eliminar toda referencia sin usar en su solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top