c# visual-studio-2008 msbuild msbuild-task

c# - Visual Studio 2008 bloquea ensamblados personalizados de MSBuild Task



visual-studio-2008 msbuild-task (3)

¿Puede editar los archivos del proyecto e incluir la siguiente declaración de propiedad?

<PropertyGroup> <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies> </PropertyGroup>

Avísame si eso funciona para ti.

Estoy desarrollando una tarea personalizada de MSBuild que construye una capa ORM y la usa en un proyecto. Me está obstaculizando el comportamiento de Visual Studio de mantener archivos DLL de tareas de MSBuild y no soltarlos.

Me gustaría organizar mi solución de esta manera;

My Solution | +- (1) ORM Layer Custom Task Project | | | +- BuildOrmLayerTask.cs // here''s my task | +- (2) Business Logic Project // and here''s the project that uses it. | +- <UsingTask TaskName="BuildOrmLayerTask" AssemblyFile="$(TaskAssembly)" />

Sin embargo, cuando se construye el proyecto (2), se bloquea en el conjunto del proyecto (1). Entonces ahora no puedo construir el proyecto (1) nuevamente sin cerrar la solución y volver a abrirla.

¿Hay alguna forma de que pueda organizar las cosas para que Visual Studio no bloquee la tarea de compilación personalizada?


Como mencioné en un comentario dirigido a @ Al-Muhandis, parece posible crear un contenedor alrededor de la tarea personalizada para que el contenedor se bloquee pero no la tarea personalizada DLL. He tomado una oportunidad inicial de hacerlo con el proyecto de tarea aislada . Puede tener errores, y solo funciona con VS2008 por ahora. Solicitudes de extracción bienvenidas.

La idea del proyecto se basó en la observación de que las tareas derivadas de MarshalByRefObject (utilizando, tal vez, AppDomainIsolatedTask ) parecen cargarse en el dominio principal de la aplicación por motivos de reflexión, pero se crea un nuevo dominio de aplicación para ejecutar la tarea. Dado que la carga en el dominio de la aplicación principal parece bloquear la DLL, fue útil crear una DLL con una tarea derivada de AppDomainIsolatedTask que carga las DLL de la tarea personalizada. De esta forma, la DLL contenedora queda bloqueada, pero dado que se ejecuta en su propio dominio de aplicación, las DLL de tareas personalizadas se descargan cuando se descarga el dominio de ejecución de la tarea contenedora. Este procedimiento evita mantener un bloqueo en los archivos DLL de tareas personalizadas una vez completada la compilación.


( Editar: Sayed Ibrahim Hashimi , que literalmente escribió el libro en msbuild, sugiere la clase AppDomainIsolatedTask para un mejor enfoque)

He logrado resolver este yo mismo ...

Encontré esta publicación en el foro de Dan Moseley , uno de los desarrolladores de MSBuild de Microsoft:

Hola,

Lamentablemente, esto se debe a que MSBuild carga ensamblajes de tareas en el dominio principal de la aplicación. El CLR no permite que los ensambles se descarguen de un dominio de aplicación, ya que esto permite importantes optimizaciones de su parte.

Las únicas soluciones alternativas que sugiero es llamar a tomsbuild.exe para compilar los proyectos que usan la tarea. Para hacer esto, cree MSBuild.exe <> como una herramienta externa en VS.

Dan
desarrollador en msbuild
DanMoseley - MSFT

Por lo tanto, parece que para detener los bloqueos, debe generar un nuevo proceso MSBuild.exe. No puede ser el que se ejecuta dentro de Visual Studio, porque cuando se ejecuta MSBuild, carga las tareas en el dominio de aplicación principal de Visual Studio y nunca se puede descargar.

  • cree un nuevo proyecto MSBuild (un .csproj o similar) que anule el objetivo ''Build'' y realice sus acciones personalizadas, por ejemplo;

    <!-- fragment of Prebuild.csproj --> <Target Name="Build"> <BuildOrmLayerTask Repository="$(Repository)" /> </Target>

  • Agrégalo a Visual Studio si lo deseas, pero usa Configuration Manager para asegurarte de que no esté construido en ninguna configuración. Simplemente deje que VS se ocupe del control de la fuente y demás, no de la construcción.

  • Edite el archivo .csproj del proyecto que depende de Prebuild.csproj . Agregue un objetivo BeforeBuild que invoca MSBuild utilizando la tarea Exec . Esto iniciará un nuevo proceso, y cuando ese proceso finalice, se liberarán los bloqueos de archivos. Ejemplo;

    <PropertyGroup> <PrebuildProject>$(SolutionDir)Prebuild/Prebuild.csproj</PrebuildProject> </PropertyGroup> <Target Name="BeforeBuild"> <Exec Command="msbuild.exe &quot;$(PrebuildProject)&quot;" /> </Target>

Ahora, cuando crea el proyecto dependiente, ejecuta MSBuild en un nuevo proceso antes de ejecutar la compilación.