none
Problema con la instalacion de un addin de outlook2003 desarrollado en visual studio 2008 RRS feed

  • Pregunta

  • Tengo un problema con la instalacion de un .msi creado con visual studio cuando desarrollo un addin para outlook.

    Creo un proyecto nuevo en visual studio 2008 en c# para office 2003 / addin for outlook, y en el codigo de "thisAddIn_Startup" pongo un simple messagebox.
    Al probarlo desde visual studio funciona perfectamente, doy al play y al iniciar el outlook, se inicia correctamente.

    El problema es el siguiente. Si desinstalo el proyecto y trato de instalarlo con el msi que genera el visual studio.

    La instalacion se hace correctamente, pero cuando abra el outloo, el mensaje no aparece, el addin no funciona.

    Si miro en las opciones de configuracion del outlook, esto aparece en los componentes .com como activado, pero no tira.

    Alguna idea?

    He probado en otro ordenador y tampoco funciona.

    He buscado diferencias entre los registros que crea el visual studio desde depuracion, y son iguales que los que crea el instalador.

    No se por que una cosa tan basica como un mensaje box ni si quiera funciona.

    Se supone que con el instalador que crea tendria que funcionar en cualquier ordenador. No tiene ningun sentido.

    Espero vuestra respuesta.

    miércoles, 7 de abril de 2010 11:22

Respuestas

  • entiendo y presumo que debe haber alguna diferencia mayor entre usar outlook 2003 o  usar el 2007.

     

    yo acabo de probar lo mismo en  outlook 2007 y me funciona sin problemas,  lamento no tener el outlook 2003 para poderte ayudar más.

     

    te recomiendo que revises esta pagina:

    http://www.clikear.com/addin_outlook_20032007_12878.aspx

     

     

     


    Juan Carlos Ruiz Microsoft MVP - Visual C# Visita mi blog: http://juank.black-byte.com
    lunes, 19 de abril de 2010 16:02
    Moderador
  • bueno, ya en este punto dónde no conozco mucho más del tema quiero sugerirte, si esta dentro de tus posibilidades , que utilices algo mucho mejor como por ejemplo esta herramienta, ya la he probado para IE y me parece buenísima:

    Herramienta para crear fácilmente Add-ins de Outlook con .NET

    Tutoriales acerca de como crear add-ins para Outlook

     

     

     


    Juan Carlos Ruiz
    Microsoft MVP - Visual C#
    Visita mi blog:

    Ideas de Un Conejo - http://juank.black-byte.com

    lunes, 3 de mayo de 2010 15:53
    Moderador
  • Pues te comento, al final si que me sirvio, dandole muchas vueltas, pero me sirvio.

    Voy a poner los pasos que he seguido, por que son varios.

    Partimos de esta base:

     

    1. Programamos en csharp en .net
    2. Estamos desarrollando un addin de Outlook 2003.
    3. El código tendría más o menos esta pinta al inicio.

     

    namespace OutlookAddIn1

    {

        public partial class ThisAddIn

        {

            private void ThisAddIn_Startup(object sender, System.EventArgs e)

            {

                MessageBox .Show("Start" );

            }

     

            private void ThisAddIn_Shutdown(object sender, System.EventArgs e)

            {

                MessageBox .Show("Shutdown" );

            }

     

            #region Código generado por VSTO

     

            /// <summary>

            /// Método necesario para admitir el Diseñador. No se puede modificar

            /// el contenido del método con el editor de código.

            /// </summary>

            private void InternalStartup()

            {

                 this .Startup += new System.EventHandler (ThisAddIn_Startup);

                this .Shutdown += new System.EventHandler (ThisAddIn_Shutdown);

            }

           

            #endregion

        }

    }

     

    Tenemos que agregar a la solucion un nuevo proyecto, llamado setSecurity y que contiene 2 clases.

    La clase SetSecurity.cs y la clase CaspolSecurityPolicyCreator.cs

     

    Clase SetSecurity.cs:

     

    //-----------------------------------------------------------------------

    //

    //  Copyright (C) Microsoft Corporation.  All rights reserved.

    //

    // THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY

    // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    // PARTICULAR PURPOSE.

    //-----------------------------------------------------------------------

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Configuration.Install;

    using System.Diagnostics;

    using System.IO;

     

    namespace CustomActions

    {

        [RunInstaller (true )]

        [System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction .Demand, Name = "FullTrust" )]

        public sealed partial class SetSecurity : Installer

        {

            public SetSecurity()

            {

                InitializeComponent();

            }

     

            public override void Install(System.Collections.IDictionary stateSaver)

            {

                // Call the base implementation.

                base .Install(stateSaver);

     

                string allUsersString = this .Context.Parameters["allUsers" ];

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                string solutionCodeGroupDescription = this .Context.Parameters["solutionCodeGroupDescription" ];

                string targetDir = this .Context.Parameters["targetDir" ];

                string assemblyName = this .Context.Parameters["assemblyName" ];

                string assemblyCodeGroupName = this .Context.Parameters["assemblyCodeGroupName" ];

                string assemblyCodeGroupDescription = this .Context.Parameters["assemblyCodeGroupDescription" ];

     

                // Note that a code group with solutionCodeGroupName name is created in the

                // Install method and removed in the Rollback and Uninstall methods.

                // The solutionCodeGroupName must be a unique name to ensure that the

                // correct code group is removed during Rollback and Uninstall.

     

                if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot set the security policy. The specified solution code group name is not valid. y la negra me la menea1" );

                if (String .IsNullOrEmpty(solutionCodeGroupDescription))

                    throw new InstallException ("Cannot set the security policy. The specified solution code group description is not valid. y la negra me la menea2" );

                if (String .IsNullOrEmpty(targetDir))

                    throw new InstallException ("Cannot set the security policy. The specified target directory is not valid. y la negra me la menea3" );

                if (String .IsNullOrEmpty(assemblyName))

                    throw new InstallException ("Cannot set the security policy. The specified assembly name is not valid. y la negra me la menea4" );

                if (String .IsNullOrEmpty(assemblyCodeGroupName))

                    throw new InstallException ("Cannot set the security policy. The specified assembly code group name is not valid. y la negra me la menea5" );

                if (String .IsNullOrEmpty(assemblyCodeGroupDescription))

                    throw new InstallException ("Cannot set the security policy. The specified assembly code group description is not valid. y la negra me la menea6" );

                if (stateSaver == null )

                    throw new ArgumentNullException ("stateSaver" );

     

                try

                 {

                    bool allUsers = String .Equals(allUsersString, "1" );

                    string assemblyPath = Path .Combine(targetDir, assemblyName);

     

                    // Note that Install method may be invoked during Repair mode and the code group

                    // may already exist.

                    // To prevent adding of another code group, remove the code group if it exists.

                    try

                    {

                        // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                        CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                    }

                    catch { }

     

                    CaspolSecurityPolicyCreator .AddSecurityPolicy(

                         allUsers,

                        solutionCodeGroupName,

                        solutionCodeGroupDescription,

                        assemblyPath,

                        assemblyCodeGroupName,

                        assemblyCodeGroupDescription);

                     stateSaver.Add("allUsers" , allUsers);

     

                }

                catch (Exception ex)

                {

                    throw new InstallException ("Cannot set the security policy." , ex);

                }

            }

     

            public override void Rollback(System.Collections.IDictionary savedState)

            {

                // Call the base implementation.

                base .Rollback(savedState);

     

                // Check whether the "allUsers" property is saved.

                // If it is not set, the Install method did not set the security policy.

                if ((savedState == null ) || (savedState["allUsers" ] == null ))

                    return ;

     

                // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot remove the security policy. The specified solution code group name is not valid." );

     

                try

                {

                    bool allUsers = (bool )savedState["allUsers" ];

                    CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                }

                catch (Exception ex)

                {

                    throw new InstallException ("Cannot remove the security policy." , ex);

                }

            }

     

     

            public override void Uninstall(System.Collections.IDictionary savedState)

            {

                // Call the base implementation.

                base .Uninstall(savedState);

     

                // Check whether the "allUsers" property is saved.

                // If it is not set, the Install method did not set the security policy.

                if ((savedState == null ) || (savedState["allUsers" ] == null ))

                    return ;

     

                // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                 if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot remove the security policy. The specified solution code group name is not valid." );

     

                try

                {

                    bool allUsers = (bool )savedState["allUsers" ];

                    CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                }

                catch (Exception ex)

                {

                    // Note that throwing an exception might stop the uninstall process.

                    // To inform the user and stop the uninstall process, throw an exception.

                    // To continue the uninstall, do not throw the exception.

                    throw new InstallException ("Cannot remove the security policy." , ex);

                }

            }

        }

    }

     

     

     

     

    jueves, 20 de mayo de 2010 9:05
  • Clase CaspolSecurityPolicyCreator.cs:

     

    //-----------------------------------------------------------------------

    //

    //  Copyright (C) Microsoft Corporation.  All rights reserved.

    //

    // THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY

    // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    // PARTICULAR PURPOSE.

    //-----------------------------------------------------------------------

     

    using System;

    using System.Collections.Generic;

    using System.Diagnostics;

    using System.IO;

    using System.Reflection;

    using System.Runtime.InteropServices;

    using System.Text;

     

    namespace CustomActions

    {

        [System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction .Demand, Name = "FullTrust" )]

        internal sealed class CaspolSecurityPolicyCreator

        {

            private CaspolSecurityPolicyCreator() { }

     

            internal static void AddSecurityPolicy(

                 bool machinePolicyLevel,

                string solutionCodeGroupName,

                string solutionCodeGroupDescription,

                string assemblyPath,

                string assemblyCodeGroupName,

                string assemblyCodeGroupDescription)

             {

                string frameworkFolder = GetFrameworkFolder();

     

                string solutionInstallationLocation = Path .GetDirectoryName(assemblyPath);

                string solutionInstallationUrl = Path .Combine(solutionInstallationLocation, "*" );

     

                 string policyLevel;

                string parentCodeGroup;

                if (machinePolicyLevel)

                {

                    policyLevel = "-m" ; // Use Machine-level policy.

                    parentCodeGroup = "My_Computer_Zone" ; // Use My_Computer_Zone for assemblies installed on the computer.

                }

                else

                {

                    policyLevel = "-u" ; // Use User-level policy.

                    parentCodeGroup = "All_Code" ;

                }

     

                // Add the solution code group. Grant no permission at this level.

                string arguments = policyLevel + " -q -ag " + parentCodeGroup + " -url \"" + solutionInstallationUrl + "\" Nothing -n \"" + solutionCodeGroupName + "\" -d \"" + solutionCodeGroupDescription + "\"" ;

                try

                 {

                    RunCaspolCommand(frameworkFolder, arguments);

                }

                catch (Exception ex)

                {

                    string error = String .Format("Cannot create the security code group '{0}'." , solutionCodeGroupName);

                     throw new Exception (error, ex);

                }

     

                // Add the assembly code group. Grant FullTrust permissions to the main assembly.

                try

                {

                    // Use the assembly strong name as the membership condition.

                    // Ensure that the assembly is strong-named to give it full trust.

                    AssemblyName assemblyName = Assembly .LoadFile(assemblyPath).GetName();

                    arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -strong -file \"" + assemblyPath + "\" \"" + assemblyName.Name + "\" \"" + assemblyName.Version.ToString(4) + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\"" ;

     

                    RunCaspolCommand(frameworkFolder, arguments);

                }

                catch (Exception ex)

                {

                    try

                    {

                        // Clean the solutionCodeGroupName.

                        RemoveSecurityPolicy(machinePolicyLevel, solutionCodeGroupName);

                    }

                    catch { }

     

                    string error = String .Format("Cannot create the security code group '{0}'." , assemblyCodeGroupName);

                    throw new Exception (error, ex);

                }

            }

     

            internal static void RemoveSecurityPolicy(

                bool machinePolicyLevel,

                string solutionCodeGroupName)

            {

                string frameworkFolder = GetFrameworkFolder();

                string policyLevel;

                if (machinePolicyLevel)

                     policyLevel = "-m" ; // Use Machine-level policy.

                else

                    policyLevel = "-u" ; // Use User-level policy.

     

                string arguments = policyLevel + " -q -rg \"" + solutionCodeGroupName + "\"" ;

                RunCaspolCommand(frameworkFolder, arguments);

            }

     

            private static string GetFrameworkFolder()

            {

                // Get the targeted Framework folder.

                Version version = new Version (2, 0, 50727);

                return GetRuntimeInstallationDirectory(version, true );

            }

     

            private static void RunCaspolCommand(string frameworkFolder, string arguments)

            {

                ProcessStartInfo processStartInfo = new ProcessStartInfo (Path .Combine(frameworkFolder, "caspol.exe" ));

                processStartInfo.CreateNoWindow = true ;

                processStartInfo.WindowStyle = ProcessWindowStyle .Hidden;

                processStartInfo.WorkingDirectory = frameworkFolder;

                processStartInfo.Arguments = arguments;

                processStartInfo.RedirectStandardError = true ;

                processStartInfo.RedirectStandardOutput = true ;

                processStartInfo.UseShellExecute = false ;

     

                Process process = Process .Start(processStartInfo);

                string caspolOutputMessage = process.StandardOutput.ReadToEnd();

                process.WaitForExit();

     

                int exitCode = 0;

                if (process.HasExited)

                    exitCode = process.ExitCode;

     

                if (exitCode != 0)

                {

                    string message = null ;

                    if (!String .IsNullOrEmpty(caspolOutputMessage))

                    {

                        String [] outputMessageLines = caspolOutputMessage.Split('\n' );

                        for (int i = 2; i < outputMessageLines.Length; i++)

                         {

                            string line = outputMessageLines[i].Trim();

                            if (!String .IsNullOrEmpty(line))

                            {

                                message = line;

                                break ;

                             }

                        }

                    }

                    if (String .IsNullOrEmpty(message))

                        message = "Cannot run the Code Access Security Policy tool (caspol.exe)." ;

     

                    throw new ApplicationException (message);

                 }

            }

     

            [Flags ]

            private enum RuntimeInfo : uint

            {

                UpgradeVersion = 0x1,           // RUNTIME_INFO_UPGRADE_VERSION

                RequestIA64 = 0x2,              // RUNTIME_INFO_REQUEST_IA64

                RequestAmd64 = 0x4,             // RUNTIME_INFO_REQUEST_AMD64

                RequestX86 = 0x8,               // RUNTIME_INFO_REQUEST_X86

                DoNotReturnDirectory = 0x10,    // RUNTIME_INFO_DONT_RETURN_DIRECTORY

                DoNotReturnVersion = 0x20,      // RUNTIME_INFO_DONT_RETURN_VERSION

                DoNotShowErrorDialog = 0x40     // RUNTIME_INFO_DONT_SHOW_ERROR_DIALOG

            }

     

            [DllImport ("mscoree.dll" , CharSet = CharSet .Unicode, ExactSpelling = true , PreserveSig = true , SetLastError = false )]

            private static extern int /* [HRESULT] */ GetRequestedRuntimeInfo(

                string /* [LPCWSTR] */ pExe,

                string /* [LPCWSTR] */ pwszVersion,

                string /* [LPCWSTR] */ pConfigurationFile,

                uint /* [DWORD] */ startupFlags,

                 RuntimeInfo /* [DWORD] */ runtimeInfoFlags,

                StringBuilder /* [LPWSTR] */ pDirectory,

                uint /* [DWORD] */ dwDirectory,

                out uint /* [DWORD *] */ dwDirectoryLength,

                StringBuilder /* [LPWSTR] */ pVersion,

                uint /* [DWORD] */ cchBuffer,

                out uint /* [DWORD *] */ dwLength

                );

     

            /// <summary>

            /// Returns the installation directory of the specified .NET runtime.

            /// </summary>

            /// <param name="version">

            /// The version of the runtime.

            /// </param>

            /// <param name="upgradeVersion">

            /// True to return the installation directory of the nearest compatible runtime version, or false for an exact match.

            /// </param>

            /// <returns>

            /// The .NET runtime installation directory.

            /// </returns>

            private static string GetRuntimeInstallationDirectory(Version version, bool upgradeVersion)

            {

                string versionString = "v" + version.ToString(3);

                RuntimeInfo runtimeInfo = RuntimeInfo .DoNotShowErrorDialog;

                if (upgradeVersion)

                    runtimeInfo |= RuntimeInfo .UpgradeVersion;

     

                StringBuilder runtimeDirectory = new StringBuilder (270);

                 StringBuilder runtimeVersion = new StringBuilder ("v65535.65535.65535" .Length);

                uint runtimeDirectoryLength;

                uint runtimeVersionLength;

                int errorCode = GetRequestedRuntimeInfo(null , versionString, null , 0, runtimeInfo, runtimeDirectory, (uint )runtimeDirectory.Capacity, out runtimeDirectoryLength, runtimeVersion, (uint )runtimeVersion.Capacity, out runtimeVersionLength);

                Marshal .ThrowExceptionForHR(errorCode);

                return Path .Combine(runtimeDirectory.ToString(), runtimeVersion.ToString());

            }

        }

    }

     

     

    jueves, 20 de mayo de 2010 9:06
  •  

     

    Una vez hecho esto, tenemos que generar un archivos de claves para que la dll de nuestro addin tenga nombre seguro, si no dará problemas en la instalación y no funcionara.

     

    Para generarlo hay dos opciones.

     

    1º Opción. Mediante consola.

    Tendremos que abrir la consola de visual Studio.

    Inicio/programas/visual Studio 2008/visual Studio Tools/Simbolo de sistema visual Studio.

     

    Pondremos lo siguiente.

    sn -k prueba.snk

     

    Este archivo se crea en la carpeta Archivos de programa\Microsoft Visual Studio 9.0\VC

     

    Lo tenemos que agregar a el proyecto de nuestra solucion donde se encuentra el addin.

     

    Con esto hecho tenemos que agregar  en el AssemblyInfo.cs una linea.

     

    [assembly : AssemblyKeyFile ("prueba.snk" )]

     

    Información Adicional sobre esto:

    http://www.elguille.info/net/dotnet/nombreseguro.htm

     

    2º Opción. Mediante Visual Studio.

     

    En el proyecto de el addin, pinchamos con el boton derecho y vamos a las propiedades.

    En la pestaña de firma, agregamos una nueva, y la creagmos.

    Con esto ya estaria, es mucho mas sencillo.


    El siguiente paso seria agregar customactions a nuestro proyecto.

     

     

    Para llegar a esta pantalla tenemos que tener seleccionado el proyecto de generación de la instalación y en las opciones de visualizacion seleccionar acciones personalizadas.

     

    Creamos una nueva acción personalizada que apunte a el resultado del proyecto proyecto setsecurity.

    En el customactiondata ponemos lo siguiente:

    /assemblyName="OutlookAddIn1.dll" /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas.OutlookAddIn1" /solutionCodeGroupDescription="Code group for OutlookAddIn1" /assemblyCodeGroupName="OutlookAddIn1" /assemblyCodeGroupDescription="Code group for OutlookAddIn1" /allUsers=[ALLUSERS]

     

     

    Con esto tendria que ser suficiente para que el instalador funcione.

    Se tendria que crear tambien uno para desinstalar.

    Mas información en:

    http://eljuanlu.blogspot.com/2007/11/un-addin-para-outlook-20032007.html

     

     

    Mas problemas que me he encontrado.

     

    Yo utilizaba una clase llamada SHDocVw.

    Al generar el proyecto de instalacion con todos los pasos anteriores ya efectuados, me ponia un mensaje de error.

    Decia que SHDocVw no tenia un nombre seguro.

     

    Buscando información hice lo siguiente:

    En la consola de visual Studio anteriormente mencionada puse lo siguiente:

    D:\Archivos de programa\Microsoft Visual Studio 9.0\VC>tlbimp SHDocVw.dll /out:Interop.SHDocVw.dll /keyfile:prueba.snk

     

    Copie la dll a mi proyecto, modifique los using y borre la anterior.

    Despues he tenido que crear otro customaction para esta dll, una distinta a la anterior.

    /assemblyName=" SHDocVw.dll " /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas. SHDocVw " /solutionCodeGroupDescription="Code group for SHDocVw " /assemblyCodeGroupName=" SHDocVw " /assemblyCodeGroupDescription="Code group for SHDocVw " /allUsers=[ALLUSERS]


    Mas información:

    http://www.dotnet247.com/247reference/msgs/34/173952.aspx

     

     

     

    Antes de instalarlo en otro equipo, hay que tener instalado en este

    El Visual Studio Tools for Office 2005.  Con el 3.0 que se puede agregar a los prerrequisitos de instalacion no funcionaba.

     

    Con este paso ya me dejo funcionar.

     

    Ahora estoy intentando que en la instalación teniendo yo en una carpeta el msi del VisualStuioToolsForOffice2005 se me instale automaticamente.

    Lo intentare, y si no lo pondre como requisito indispensable.

     

    Espero que si ha alguien le ocurre esto le sirva de ayuda lo que he escrito, puesto que he encontrado muy poca informacion sobre este tema, al menos informacion que te detallara los pasos.

     

    Ya me direis que os parece.

    El codigo de las funciones de la clase setsecurity se puede descargar completo del link de la pagina.

    http://www.koders.com/csharp/fidDC5A2D42FE98AD20FFC65C4435785CDFE3CB5B10.aspx


    jueves, 20 de mayo de 2010 9:06

Todas las respuestas

  • Si quereis podeis hacer un proyecto nuevo de addin outlook2003 y probarlo, no funciona nunca.

     

    Nadie Responde??

     

    viernes, 9 de abril de 2010 8:41
  • A nadie le pasa??, no me podeis ayudar??

     

    lunes, 12 de abril de 2010 14:04
  • es dificil ayudarte sin ver el codigo, ya que evidentemente es un error de programacion. Coloca el codigo y veremos que se puede hacer.
    Juan Carlos Ruiz Microsoft MVP - Visual C# Visita mi blog: http://juank.black-byte.com
    lunes, 19 de abril de 2010 14:59
    Moderador
  • Te pongo el codigo, pero realmente dudo que sea eso.

    Todo el codigo que pruebo lo genera automaticamente el visual studio 2008 y yo lo unico que hago es crear un MessageBox.show cuando se inicia el addin en el outlook.

    No es la funcionalidad que busco, claramente, pero es la prueba que estoy haciendo para comprobar que se instala en otros equipos.

     

    using System;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.Tools.Applications.Runtime;
    using Outlook = Microsoft.Office.Interop.Outlook;
    using Office = Microsoft.Office.Core;
    
    namespace OutlookAddIn1
    {
      public partial class ThisAddIn
      {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
          MessageBox.Show("OK");
    } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } #region Código generado por VSTO /// <summary> /// Método necesario para admitir el Diseñador. No se puede modificar /// el contenido del método con el editor de código. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } }

    El codigo que pongo aqui como puedes ver es el mismo que te crea el visual studio al crear un proyecto en c# para office 2003 como complemento para Outlook 2003.

     

    Si quereis podeis probar a crear un proyecto con esas caracteristicas, y probar el instalador en un equipo diferente para ver que no funciona.

     

    lunes, 19 de abril de 2010 15:13
  • entiendo y presumo que debe haber alguna diferencia mayor entre usar outlook 2003 o  usar el 2007.

     

    yo acabo de probar lo mismo en  outlook 2007 y me funciona sin problemas,  lamento no tener el outlook 2003 para poderte ayudar más.


    Juan Carlos Ruiz Microsoft MVP - Visual C# Visita mi blog: http://juank.black-byte.com
    lunes, 19 de abril de 2010 16:02
    Moderador
  • entiendo y presumo que debe haber alguna diferencia mayor entre usar outlook 2003 o  usar el 2007.

     

    yo acabo de probar lo mismo en  outlook 2007 y me funciona sin problemas,  lamento no tener el outlook 2003 para poderte ayudar más.

     

    te recomiendo que revises esta pagina:

    http://www.clikear.com/addin_outlook_20032007_12878.aspx

     

     

     


    Juan Carlos Ruiz Microsoft MVP - Visual C# Visita mi blog: http://juank.black-byte.com
    lunes, 19 de abril de 2010 16:02
    Moderador
  • Muchas gracias por mirarlo un poco.

     

    He estado probando lo que pone en la pagina que me has recomendado.

    Lo de el registro lo he comprobado y esta bien.

    No estiendo muy bien donde pone

    Y lo más importante, como conseguir "Full-Trust" para que la instalación se realice correctamente y el addin se cargue sin problemas (Custom Actions):
    
      1. Crear el proyecto "OutlookAddIn1.SetSecurity"
      2. Crear y anadir las clases "CaspolSecurityPolicyCreator" y "SetSecurity". El contenido de estas clases puede obtenerse desde aquí.
      3. Install - CustomActionData: /assemblyName="OutlookAddIn1.dll" /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas.OutlookAddIn1" /solutionCodeGroupDescription="Code group for OutlookAddIn1" /assemblyCodeGroupName="OutlookAddIn1" /assemblyCodeGroupDescription="Code group for OutlookAddIn1" /allUsers=[ALLUSERS]
      4. "Rollback - CustomActionData" y "Uninstall - CustomActionData": /solutionCodeGroupName="Pruebas.OutlookAddIn1"
      5. Dejar en blanco la acción "Commit - CustomActionData".

    El proyecto setSecurity tiene que estar dentro del mio, para que se cargue con la instalacion??.

    La linea 3 y 4  no se donde tendria que agregarla.

    Tampoco entiendo esto de dejar en blanco la accion Commit-customActionData.

    Muchas gracias de antemano.

    martes, 20 de abril de 2010 9:32
  • como te acabo de ir con esto?

     

    te sirvio el link?


    Juan Carlos Ruiz
    Microsoft MVP - Visual C#
    Visita mi blog:

    Ideas de Un Conejo - http://juank.black-byte.com

    lunes, 3 de mayo de 2010 13:33
    Moderador
  • Pues sigo con las dudas de la respuesta anterior.

    /*

    Y lo más importante, como conseguir "Full-Trust" para que la instalación se realice correctamente y el addin se cargue sin problemas (Custom Actions):

    1. Crear el proyecto "OutlookAddIn1.SetSecurity"
    2. Crear y anadir las clases "CaspolSecurityPolicyCreator" y "SetSecurity". El contenido de estas clases puede obtenerse desde aquí.
    3. Install - CustomActionData: /assemblyName="OutlookAddIn1.dll" /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas.OutlookAddIn1" /solutionCodeGroupDescription="Code group for OutlookAddIn1" /assemblyCodeGroupName="OutlookAddIn1" /assemblyCodeGroupDescription="Code group for OutlookAddIn1" /allUsers=[ALLUSERS]
    4. "Rollback - CustomActionData" y "Uninstall - CustomActionData": /solutionCodeGroupName="Pruebas.OutlookAddIn1"
    5. Dejar en blanco la acción "Commit - CustomActionData".

    El proyecto setSecurity tiene que estar dentro del mio, para que se cargue con la instalacion??.

    */

     

    Realmente no se como hacer esos pasos.

    lunes, 3 de mayo de 2010 15:11
  • bueno, ya en este punto dónde no conozco mucho más del tema quiero sugerirte, si esta dentro de tus posibilidades , que utilices algo mucho mejor como por ejemplo esta herramienta, ya la he probado para IE y me parece buenísima:

    Herramienta para crear fácilmente Add-ins de Outlook con .NET

    Tutoriales acerca de como crear add-ins para Outlook

     

     

     


    Juan Carlos Ruiz
    Microsoft MVP - Visual C#
    Visita mi blog:

    Ideas de Un Conejo - http://juank.black-byte.com

    lunes, 3 de mayo de 2010 15:53
    Moderador
  • Muchas gracias.

    De todos modos, espero conseguirlo, ahora mismo estoy con alguna otra cosilla, me quede atascado en eso.

    Si lo consuigo mas adelante ya hos comentare.

    De todos modos si alguien conoce la solucion...

    Que no se corte y la escriba.

    Gracias.

    martes, 4 de mayo de 2010 16:55
  • hola, que hay de nuevo?
    Juan Carlos Ruiz
    Microsoft MVP - Visual C#
    Visita mi blog:

    Ideas de Un Conejo - http://juank.black-byte.com

    miércoles, 19 de mayo de 2010 13:52
    Moderador
  • Pues te comento, al final si que me sirvio, dandole muchas vueltas, pero me sirvio.

    Voy a poner los pasos que he seguido, por que son varios.

    Partimos de esta base:

     

    1. Programamos en csharp en .net
    2. Estamos desarrollando un addin de Outlook 2003.
    3. El código tendría más o menos esta pinta al inicio.

     

    namespace OutlookAddIn1

    {

        public partial class ThisAddIn

        {

            private void ThisAddIn_Startup(object sender, System.EventArgs e)

            {

                MessageBox .Show("Start" );

            }

     

            private void ThisAddIn_Shutdown(object sender, System.EventArgs e)

            {

                MessageBox .Show("Shutdown" );

            }

     

            #region Código generado por VSTO

     

            /// <summary>

            /// Método necesario para admitir el Diseñador. No se puede modificar

            /// el contenido del método con el editor de código.

            /// </summary>

            private void InternalStartup()

            {

                 this .Startup += new System.EventHandler (ThisAddIn_Startup);

                this .Shutdown += new System.EventHandler (ThisAddIn_Shutdown);

            }

           

            #endregion

        }

    }

     

    Tenemos que agregar a la solucion un nuevo proyecto, llamado setSecurity y que contiene 2 clases.

    La clase SetSecurity.cs y la clase CaspolSecurityPolicyCreator.cs

     

    Clase SetSecurity.cs:

     

    //-----------------------------------------------------------------------

    //

    //  Copyright (C) Microsoft Corporation.  All rights reserved.

    //

    // THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY

    // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    // PARTICULAR PURPOSE.

    //-----------------------------------------------------------------------

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Configuration.Install;

    using System.Diagnostics;

    using System.IO;

     

    namespace CustomActions

    {

        [RunInstaller (true )]

        [System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction .Demand, Name = "FullTrust" )]

        public sealed partial class SetSecurity : Installer

        {

            public SetSecurity()

            {

                InitializeComponent();

            }

     

            public override void Install(System.Collections.IDictionary stateSaver)

            {

                // Call the base implementation.

                base .Install(stateSaver);

     

                string allUsersString = this .Context.Parameters["allUsers" ];

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                string solutionCodeGroupDescription = this .Context.Parameters["solutionCodeGroupDescription" ];

                string targetDir = this .Context.Parameters["targetDir" ];

                string assemblyName = this .Context.Parameters["assemblyName" ];

                string assemblyCodeGroupName = this .Context.Parameters["assemblyCodeGroupName" ];

                string assemblyCodeGroupDescription = this .Context.Parameters["assemblyCodeGroupDescription" ];

     

                // Note that a code group with solutionCodeGroupName name is created in the

                // Install method and removed in the Rollback and Uninstall methods.

                // The solutionCodeGroupName must be a unique name to ensure that the

                // correct code group is removed during Rollback and Uninstall.

     

                if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot set the security policy. The specified solution code group name is not valid. y la negra me la menea1" );

                if (String .IsNullOrEmpty(solutionCodeGroupDescription))

                    throw new InstallException ("Cannot set the security policy. The specified solution code group description is not valid. y la negra me la menea2" );

                if (String .IsNullOrEmpty(targetDir))

                    throw new InstallException ("Cannot set the security policy. The specified target directory is not valid. y la negra me la menea3" );

                if (String .IsNullOrEmpty(assemblyName))

                    throw new InstallException ("Cannot set the security policy. The specified assembly name is not valid. y la negra me la menea4" );

                if (String .IsNullOrEmpty(assemblyCodeGroupName))

                    throw new InstallException ("Cannot set the security policy. The specified assembly code group name is not valid. y la negra me la menea5" );

                if (String .IsNullOrEmpty(assemblyCodeGroupDescription))

                    throw new InstallException ("Cannot set the security policy. The specified assembly code group description is not valid. y la negra me la menea6" );

                if (stateSaver == null )

                    throw new ArgumentNullException ("stateSaver" );

     

                try

                 {

                    bool allUsers = String .Equals(allUsersString, "1" );

                    string assemblyPath = Path .Combine(targetDir, assemblyName);

     

                    // Note that Install method may be invoked during Repair mode and the code group

                    // may already exist.

                    // To prevent adding of another code group, remove the code group if it exists.

                    try

                    {

                        // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                        CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                    }

                    catch { }

     

                    CaspolSecurityPolicyCreator .AddSecurityPolicy(

                         allUsers,

                        solutionCodeGroupName,

                        solutionCodeGroupDescription,

                        assemblyPath,

                        assemblyCodeGroupName,

                        assemblyCodeGroupDescription);

                     stateSaver.Add("allUsers" , allUsers);

     

                }

                catch (Exception ex)

                {

                    throw new InstallException ("Cannot set the security policy." , ex);

                }

            }

     

            public override void Rollback(System.Collections.IDictionary savedState)

            {

                // Call the base implementation.

                base .Rollback(savedState);

     

                // Check whether the "allUsers" property is saved.

                // If it is not set, the Install method did not set the security policy.

                if ((savedState == null ) || (savedState["allUsers" ] == null ))

                    return ;

     

                // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot remove the security policy. The specified solution code group name is not valid." );

     

                try

                {

                    bool allUsers = (bool )savedState["allUsers" ];

                    CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                }

                catch (Exception ex)

                {

                    throw new InstallException ("Cannot remove the security policy." , ex);

                }

            }

     

     

            public override void Uninstall(System.Collections.IDictionary savedState)

            {

                // Call the base implementation.

                base .Uninstall(savedState);

     

                // Check whether the "allUsers" property is saved.

                // If it is not set, the Install method did not set the security policy.

                if ((savedState == null ) || (savedState["allUsers" ] == null ))

                    return ;

     

                // The solutionCodeGroupName must be a unique name; otherwise, the method might delete wrong code group.

                string solutionCodeGroupName = this .Context.Parameters["solutionCodeGroupName" ];

                 if (String .IsNullOrEmpty(solutionCodeGroupName))

                    throw new InstallException ("Cannot remove the security policy. The specified solution code group name is not valid." );

     

                try

                {

                    bool allUsers = (bool )savedState["allUsers" ];

                    CaspolSecurityPolicyCreator .RemoveSecurityPolicy(allUsers, solutionCodeGroupName);

                }

                catch (Exception ex)

                {

                    // Note that throwing an exception might stop the uninstall process.

                    // To inform the user and stop the uninstall process, throw an exception.

                    // To continue the uninstall, do not throw the exception.

                    throw new InstallException ("Cannot remove the security policy." , ex);

                }

            }

        }

    }

     

     

     

     

    jueves, 20 de mayo de 2010 9:05
  • Clase CaspolSecurityPolicyCreator.cs:

     

    //-----------------------------------------------------------------------

    //

    //  Copyright (C) Microsoft Corporation.  All rights reserved.

    //

    // THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY

    // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    // PARTICULAR PURPOSE.

    //-----------------------------------------------------------------------

     

    using System;

    using System.Collections.Generic;

    using System.Diagnostics;

    using System.IO;

    using System.Reflection;

    using System.Runtime.InteropServices;

    using System.Text;

     

    namespace CustomActions

    {

        [System.Security.Permissions.PermissionSetAttribute (System.Security.Permissions.SecurityAction .Demand, Name = "FullTrust" )]

        internal sealed class CaspolSecurityPolicyCreator

        {

            private CaspolSecurityPolicyCreator() { }

     

            internal static void AddSecurityPolicy(

                 bool machinePolicyLevel,

                string solutionCodeGroupName,

                string solutionCodeGroupDescription,

                string assemblyPath,

                string assemblyCodeGroupName,

                string assemblyCodeGroupDescription)

             {

                string frameworkFolder = GetFrameworkFolder();

     

                string solutionInstallationLocation = Path .GetDirectoryName(assemblyPath);

                string solutionInstallationUrl = Path .Combine(solutionInstallationLocation, "*" );

     

                 string policyLevel;

                string parentCodeGroup;

                if (machinePolicyLevel)

                {

                    policyLevel = "-m" ; // Use Machine-level policy.

                    parentCodeGroup = "My_Computer_Zone" ; // Use My_Computer_Zone for assemblies installed on the computer.

                }

                else

                {

                    policyLevel = "-u" ; // Use User-level policy.

                    parentCodeGroup = "All_Code" ;

                }

     

                // Add the solution code group. Grant no permission at this level.

                string arguments = policyLevel + " -q -ag " + parentCodeGroup + " -url \"" + solutionInstallationUrl + "\" Nothing -n \"" + solutionCodeGroupName + "\" -d \"" + solutionCodeGroupDescription + "\"" ;

                try

                 {

                    RunCaspolCommand(frameworkFolder, arguments);

                }

                catch (Exception ex)

                {

                    string error = String .Format("Cannot create the security code group '{0}'." , solutionCodeGroupName);

                     throw new Exception (error, ex);

                }

     

                // Add the assembly code group. Grant FullTrust permissions to the main assembly.

                try

                {

                    // Use the assembly strong name as the membership condition.

                    // Ensure that the assembly is strong-named to give it full trust.

                    AssemblyName assemblyName = Assembly .LoadFile(assemblyPath).GetName();

                    arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -strong -file \"" + assemblyPath + "\" \"" + assemblyName.Name + "\" \"" + assemblyName.Version.ToString(4) + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\"" ;

     

                    RunCaspolCommand(frameworkFolder, arguments);

                }

                catch (Exception ex)

                {

                    try

                    {

                        // Clean the solutionCodeGroupName.

                        RemoveSecurityPolicy(machinePolicyLevel, solutionCodeGroupName);

                    }

                    catch { }

     

                    string error = String .Format("Cannot create the security code group '{0}'." , assemblyCodeGroupName);

                    throw new Exception (error, ex);

                }

            }

     

            internal static void RemoveSecurityPolicy(

                bool machinePolicyLevel,

                string solutionCodeGroupName)

            {

                string frameworkFolder = GetFrameworkFolder();

                string policyLevel;

                if (machinePolicyLevel)

                     policyLevel = "-m" ; // Use Machine-level policy.

                else

                    policyLevel = "-u" ; // Use User-level policy.

     

                string arguments = policyLevel + " -q -rg \"" + solutionCodeGroupName + "\"" ;

                RunCaspolCommand(frameworkFolder, arguments);

            }

     

            private static string GetFrameworkFolder()

            {

                // Get the targeted Framework folder.

                Version version = new Version (2, 0, 50727);

                return GetRuntimeInstallationDirectory(version, true );

            }

     

            private static void RunCaspolCommand(string frameworkFolder, string arguments)

            {

                ProcessStartInfo processStartInfo = new ProcessStartInfo (Path .Combine(frameworkFolder, "caspol.exe" ));

                processStartInfo.CreateNoWindow = true ;

                processStartInfo.WindowStyle = ProcessWindowStyle .Hidden;

                processStartInfo.WorkingDirectory = frameworkFolder;

                processStartInfo.Arguments = arguments;

                processStartInfo.RedirectStandardError = true ;

                processStartInfo.RedirectStandardOutput = true ;

                processStartInfo.UseShellExecute = false ;

     

                Process process = Process .Start(processStartInfo);

                string caspolOutputMessage = process.StandardOutput.ReadToEnd();

                process.WaitForExit();

     

                int exitCode = 0;

                if (process.HasExited)

                    exitCode = process.ExitCode;

     

                if (exitCode != 0)

                {

                    string message = null ;

                    if (!String .IsNullOrEmpty(caspolOutputMessage))

                    {

                        String [] outputMessageLines = caspolOutputMessage.Split('\n' );

                        for (int i = 2; i < outputMessageLines.Length; i++)

                         {

                            string line = outputMessageLines[i].Trim();

                            if (!String .IsNullOrEmpty(line))

                            {

                                message = line;

                                break ;

                             }

                        }

                    }

                    if (String .IsNullOrEmpty(message))

                        message = "Cannot run the Code Access Security Policy tool (caspol.exe)." ;

     

                    throw new ApplicationException (message);

                 }

            }

     

            [Flags ]

            private enum RuntimeInfo : uint

            {

                UpgradeVersion = 0x1,           // RUNTIME_INFO_UPGRADE_VERSION

                RequestIA64 = 0x2,              // RUNTIME_INFO_REQUEST_IA64

                RequestAmd64 = 0x4,             // RUNTIME_INFO_REQUEST_AMD64

                RequestX86 = 0x8,               // RUNTIME_INFO_REQUEST_X86

                DoNotReturnDirectory = 0x10,    // RUNTIME_INFO_DONT_RETURN_DIRECTORY

                DoNotReturnVersion = 0x20,      // RUNTIME_INFO_DONT_RETURN_VERSION

                DoNotShowErrorDialog = 0x40     // RUNTIME_INFO_DONT_SHOW_ERROR_DIALOG

            }

     

            [DllImport ("mscoree.dll" , CharSet = CharSet .Unicode, ExactSpelling = true , PreserveSig = true , SetLastError = false )]

            private static extern int /* [HRESULT] */ GetRequestedRuntimeInfo(

                string /* [LPCWSTR] */ pExe,

                string /* [LPCWSTR] */ pwszVersion,

                string /* [LPCWSTR] */ pConfigurationFile,

                uint /* [DWORD] */ startupFlags,

                 RuntimeInfo /* [DWORD] */ runtimeInfoFlags,

                StringBuilder /* [LPWSTR] */ pDirectory,

                uint /* [DWORD] */ dwDirectory,

                out uint /* [DWORD *] */ dwDirectoryLength,

                StringBuilder /* [LPWSTR] */ pVersion,

                uint /* [DWORD] */ cchBuffer,

                out uint /* [DWORD *] */ dwLength

                );

     

            /// <summary>

            /// Returns the installation directory of the specified .NET runtime.

            /// </summary>

            /// <param name="version">

            /// The version of the runtime.

            /// </param>

            /// <param name="upgradeVersion">

            /// True to return the installation directory of the nearest compatible runtime version, or false for an exact match.

            /// </param>

            /// <returns>

            /// The .NET runtime installation directory.

            /// </returns>

            private static string GetRuntimeInstallationDirectory(Version version, bool upgradeVersion)

            {

                string versionString = "v" + version.ToString(3);

                RuntimeInfo runtimeInfo = RuntimeInfo .DoNotShowErrorDialog;

                if (upgradeVersion)

                    runtimeInfo |= RuntimeInfo .UpgradeVersion;

     

                StringBuilder runtimeDirectory = new StringBuilder (270);

                 StringBuilder runtimeVersion = new StringBuilder ("v65535.65535.65535" .Length);

                uint runtimeDirectoryLength;

                uint runtimeVersionLength;

                int errorCode = GetRequestedRuntimeInfo(null , versionString, null , 0, runtimeInfo, runtimeDirectory, (uint )runtimeDirectory.Capacity, out runtimeDirectoryLength, runtimeVersion, (uint )runtimeVersion.Capacity, out runtimeVersionLength);

                Marshal .ThrowExceptionForHR(errorCode);

                return Path .Combine(runtimeDirectory.ToString(), runtimeVersion.ToString());

            }

        }

    }

     

     

    jueves, 20 de mayo de 2010 9:06
  •  

     

    Una vez hecho esto, tenemos que generar un archivos de claves para que la dll de nuestro addin tenga nombre seguro, si no dará problemas en la instalación y no funcionara.

     

    Para generarlo hay dos opciones.

     

    1º Opción. Mediante consola.

    Tendremos que abrir la consola de visual Studio.

    Inicio/programas/visual Studio 2008/visual Studio Tools/Simbolo de sistema visual Studio.

     

    Pondremos lo siguiente.

    sn -k prueba.snk

     

    Este archivo se crea en la carpeta Archivos de programa\Microsoft Visual Studio 9.0\VC

     

    Lo tenemos que agregar a el proyecto de nuestra solucion donde se encuentra el addin.

     

    Con esto hecho tenemos que agregar  en el AssemblyInfo.cs una linea.

     

    [assembly : AssemblyKeyFile ("prueba.snk" )]

     

    Información Adicional sobre esto:

    http://www.elguille.info/net/dotnet/nombreseguro.htm

     

    2º Opción. Mediante Visual Studio.

     

    En el proyecto de el addin, pinchamos con el boton derecho y vamos a las propiedades.

    En la pestaña de firma, agregamos una nueva, y la creagmos.

    Con esto ya estaria, es mucho mas sencillo.


    El siguiente paso seria agregar customactions a nuestro proyecto.

     

     

    Para llegar a esta pantalla tenemos que tener seleccionado el proyecto de generación de la instalación y en las opciones de visualizacion seleccionar acciones personalizadas.

     

    Creamos una nueva acción personalizada que apunte a el resultado del proyecto proyecto setsecurity.

    En el customactiondata ponemos lo siguiente:

    /assemblyName="OutlookAddIn1.dll" /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas.OutlookAddIn1" /solutionCodeGroupDescription="Code group for OutlookAddIn1" /assemblyCodeGroupName="OutlookAddIn1" /assemblyCodeGroupDescription="Code group for OutlookAddIn1" /allUsers=[ALLUSERS]

     

     

    Con esto tendria que ser suficiente para que el instalador funcione.

    Se tendria que crear tambien uno para desinstalar.

    Mas información en:

    http://eljuanlu.blogspot.com/2007/11/un-addin-para-outlook-20032007.html

     

     

    Mas problemas que me he encontrado.

     

    Yo utilizaba una clase llamada SHDocVw.

    Al generar el proyecto de instalacion con todos los pasos anteriores ya efectuados, me ponia un mensaje de error.

    Decia que SHDocVw no tenia un nombre seguro.

     

    Buscando información hice lo siguiente:

    En la consola de visual Studio anteriormente mencionada puse lo siguiente:

    D:\Archivos de programa\Microsoft Visual Studio 9.0\VC>tlbimp SHDocVw.dll /out:Interop.SHDocVw.dll /keyfile:prueba.snk

     

    Copie la dll a mi proyecto, modifique los using y borre la anterior.

    Despues he tenido que crear otro customaction para esta dll, una distinta a la anterior.

    /assemblyName=" SHDocVw.dll " /targetDir="[TARGETDIR]\" /solutionCodeGroupName="Pruebas. SHDocVw " /solutionCodeGroupDescription="Code group for SHDocVw " /assemblyCodeGroupName=" SHDocVw " /assemblyCodeGroupDescription="Code group for SHDocVw " /allUsers=[ALLUSERS]


    Mas información:

    http://www.dotnet247.com/247reference/msgs/34/173952.aspx

     

     

     

    Antes de instalarlo en otro equipo, hay que tener instalado en este

    El Visual Studio Tools for Office 2005.  Con el 3.0 que se puede agregar a los prerrequisitos de instalacion no funcionaba.

     

    Con este paso ya me dejo funcionar.

     

    Ahora estoy intentando que en la instalación teniendo yo en una carpeta el msi del VisualStuioToolsForOffice2005 se me instale automaticamente.

    Lo intentare, y si no lo pondre como requisito indispensable.

     

    Espero que si ha alguien le ocurre esto le sirva de ayuda lo que he escrito, puesto que he encontrado muy poca informacion sobre este tema, al menos informacion que te detallara los pasos.

     

    Ya me direis que os parece.

    El codigo de las funciones de la clase setsecurity se puede descargar completo del link de la pagina.

    http://www.koders.com/csharp/fidDC5A2D42FE98AD20FFC65C4435785CDFE3CB5B10.aspx


    jueves, 20 de mayo de 2010 9:06