Para poder publicar una DLL en el GAC, es necesario que esté firmada.
Adicionalmente, para poderla utilizar en fuentes cuyo framework es 4.5.1, es necesario recompilarla en dicha versión.
Dado que no es posible firmar la LibX.dll ni actualizar su framework (porque si se hace habría que recompilar todos los fuentes que la utilicen), se definió un post-build event, que realiza las siguientes acciones:
1. Compilar la librería en la versión framework 4.5.1 (dejando la .dll resultante en una carpeta auxiliar)
2. Firmar la .dll con la clave disponible para dicha librería (el archivo keyLibX.snk en este caso)
3. Instalar la .dll firmada en el GAC, mediante gacutil
Este es el código del post-build event:
call "$(DevEnvDir)..\Tools\vsvars32.bat"
IF NOT EXIST c:\temp\$(TargetName)\OutDir mkdir C:\temp\$(TargetName)\OutDir
IF NOT EXIST c:\temp\$(TargetName)\Signed mkdir C:\temp\$(TargetName)\Signed
IF NOT EXIST $(TargetDir)\Signed mkdir $(TargetDir)\Signed
msbuild.exe $(ProjectPath) /p:TargetFrameworkVersion=v4.5.1;Configuration=Release /tv:4.0 /t:Rebuild /p:OutDir=c:\temp\$(TargetName)\Outdir /p:PreBuildEvent= /p:PostBuildEvent=
ildasm.exe $(TargetPath) /out:$(TargetDir)\Signed\$(TargetName).il
ilasm.exe $(TargetDir)\Signed\$(TargetName).il /dll /key=$(ProjectDir)\keyLibX.snk /output=$(TargetDir)\Signed\$(TargetName).dll
gacutil.exe /i $(TargetDir)\Signed\$(TargetName).dll /f
El objetivo de este post-build event, es lograr que una .dll que no esté firmada y en una versión anterior de framework, llegue al GAC con la versión 4.5.1 de framework, sin modificar el fuente del proyecto para no afectar a los otros desarrollos que la utilizan.
Post build event: The command xxx exited with code 9009
Este error ocurre cuando faltan los seteos de entorno de Visual Studio.
Para solucionarlo, en el post build event agregar como 1ra linea esta sentencia:
call "$(DevEnvDir)..\Tools\vsvars32.bat"
Para solucionarlo, en el post build event agregar como 1ra linea esta sentencia:
call "$(DevEnvDir)..\Tools\vsvars32.bat"
Access Denied. An exception of type 'System.Runtime.InteropServices.COMException' occurred in xxx.dll
Al intentar abrir un archivo excel mediante office interop ocurre este error:
An exception of type 'System.Runtime.InteropServices.COMException' occurred in xxx.dll
Microsoft Excel no puede obtener acceso al archivo aaa.xls
-Crear una carpeta llamada Desktop dentro de esta ruta:
C:\Windows\System32\config\systemprofile
Si se trata de office 32 bits, crearla en esta ubicación
C:\Windows\SysWOW64\config\systemprofile
-Agregar permisos a esta carpeta, para el usuario que se configure en el app pool (por ej, X\userconnect)
Adicionalmente, el problema puede darse porque el usuario con el que se está ejecutando el app pool no está configurado en la seguridad de los componentes DCOM.
Para configurarlo, ejecutar dcomcnfg.exe
En este caso, el app pool se está ejecutando con el usuario X\userconnect
Permisos de inicio y activación:
Permisos de acceso:
Permisos de configuración:
Identidad:
An exception of type 'System.Runtime.InteropServices.COMException' occurred in xxx.dll
Microsoft Excel no puede obtener acceso al archivo aaa.xls
-Crear una carpeta llamada Desktop dentro de esta ruta:
C:\Windows\System32\config\systemprofile
Si se trata de office 32 bits, crearla en esta ubicación
C:\Windows\SysWOW64\config\systemprofile
-Agregar permisos a esta carpeta, para el usuario que se configure en el app pool (por ej, X\userconnect)
Adicionalmente, el problema puede darse porque el usuario con el que se está ejecutando el app pool no está configurado en la seguridad de los componentes DCOM.
Para configurarlo, ejecutar dcomcnfg.exe
En las propiedades de Microsoft Excel Application, configurar lo siguiente:
En este caso, el app pool se está ejecutando con el usuario X\userconnect
Permisos de inicio y activación:
Permisos de acceso:
Permisos de configuración:
Identidad:
Buscar una tabla en el modelo edmx
Para localizar una tabla en el diagrama de entidades (edmx):
1. Abrir el .edmx
2. Hacer click en la pestaña "Model Browser"
**Si la pestaña Model Browser no está visible, ir a View / Other Windows / Entity Data Model Browser ***
3. Ubicar la tabla en la lista, y luego hacer click derecho y "Show in Diagram"
1. Abrir el .edmx
2. Hacer click en la pestaña "Model Browser"
**Si la pestaña Model Browser no está visible, ir a View / Other Windows / Entity Data Model Browser ***
3. Ubicar la tabla en la lista, y luego hacer click derecho y "Show in Diagram"
Customizar proceso de compilación en Visual Studio (ej para quitar readonly)
Ejemplo:
Quitar atributo readonly de la solucion antes de empezar la compilación:
1. Editar el archivo
C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets
***si no deja modificarlo es porque el usuario no tiene permisos sobre este archivo. Editar las propiedades del archivo, luego ir a seguridad y agregar el usuario con permisos sobre el mismo***
2. Buscar el tag <Target Name="BeforeBuild" /> y sustituirlo por lo siguiente
<Target Name="BeforeBuild">
<Message Text ="Hello World" />
<Exec Command="calc.exe" />
</Target>
Esto es un ejemplo, cuando se compile un proyecto de .Net, en el output de la compilación aparecerá el mensaje Hello World, y se abrira la calculadora:
Target "BeforeBuild: (TargetId:3)" in file "C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets" from project "c:\temp\PruebaXX\PruebaXX\PruebaXX.csproj" (target "Build" depends on it):
Task "Message" (TaskId:4)
Task Parameter:Text=Hello World (TaskId:4)
Hello World (TaskId:4)
Done executing task "Message". (TaskId:4)
Ejemplo 2: Quitar atributo Readonly de la solución antes de iniciar la compilación
Editar el archivo
C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets
Sustituir
<Target Name="BeforeBuild" />
por
<Target Name="BeforeBuild">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
Sustituir
<Target Name="BeforeReBuild" />
por
<Target Name="BeforeRebuild">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
Sustituir
<Target Name="BeforeClean" />
por
<Target Name="BeforeClean">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
En este link también hay ejemplos para ejecutar código C# dentro del xml
https://www.universalthread.com/ViewPageArticle.aspx?ID=61
Quitar atributo readonly de la solucion antes de empezar la compilación:
1. Editar el archivo
C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets
***si no deja modificarlo es porque el usuario no tiene permisos sobre este archivo. Editar las propiedades del archivo, luego ir a seguridad y agregar el usuario con permisos sobre el mismo***
2. Buscar el tag <Target Name="BeforeBuild" /> y sustituirlo por lo siguiente
<Target Name="BeforeBuild">
<Message Text ="Hello World" />
<Exec Command="calc.exe" />
</Target>
Target "BeforeBuild: (TargetId:3)" in file "C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets" from project "c:\temp\PruebaXX\PruebaXX\PruebaXX.csproj" (target "Build" depends on it):
Task "Message" (TaskId:4)
Task Parameter:Text=Hello World (TaskId:4)
Hello World (TaskId:4)
Done executing task "Message". (TaskId:4)
Ejemplo 2: Quitar atributo Readonly de la solución antes de iniciar la compilación
Editar el archivo
C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Common.CurrentVersion.targets
<Target Name="BeforeBuild" />
por
<Target Name="BeforeBuild">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
Sustituir
<Target Name="BeforeReBuild" />
por
<Target Name="BeforeRebuild">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
Sustituir
<Target Name="BeforeCompile" />
por
<Target Name="BeforeCompile">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
<Target Name="BeforeClean" />
por
<Target Name="BeforeClean">
<Exec Command="attrib -R $(SolutionDir)*.* /S" />
</Target>
En este link también hay ejemplos para ejecutar código C# dentro del xml
https://www.universalthread.com/ViewPageArticle.aspx?ID=61
Suscribirse a:
Comentarios (Atom)








