Automation add-in : le fichier que vous avez sélectionné ne contient pas de nouv [Résolu]

Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 13 juil. 2007 à 11:53 - Dernière réponse :
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 20 sept. 2007 à 19:29
Bonjour à tous

j'ai crée une bibliothèque de fonctions. Je voulais appeller les fonctions à partir d'Excel (2003). Alors j'ai crée un automation add-in sur Visual Studio. Quand je rentre sur Excel, je vais sur macro complémentaires, j'ajoute la dll (add-in), et tout marche bien sur mon ordinateur. Par contre si je mets la dll sur un autre ordinateur, Excel ne reconnait pas le add-in.

En fait, j'avais déjà installé le runtime VSTO. Quand je démande à Excel d'ajouter la macro complémentaire, il me sort un message d'erreur: "le fichier que vous avez sélectionné ne contient pas de nouveau serveur Automation, ou vous ne disposez pas de privilèges suffisants pour enregistrer le serveur Automation" ou "The File you selected does not contain a new Automation Server, or you do not have sufficient privileges to register the Automation Server" .

Sur ma machine ça marche normalement... sauf si j'ai un message d'Excel en disant qu'il n'arrive pas à trouver le mscoree.dll. Si je clique sur oui, il perd la réference de la macro complémentaire, puis si j'essaye de trouver et rajouter ma dll, Excel me sort le même message d'erreur. Quelqu'un a une idée, SVP?

Comment dois je proceder, SVP?

Otavio Reis
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 31 juil. 2007 à 19:40
3
Merci
salut,

oui, je vois le prb (la class s'appelle TBInstall mais la partial Installer2) mais ca sera plus simple de le faire autrement :
-> tu ajoutes un nouvel item de type Installer
-> tu ne t'occupes pas de .Designer.cs
-> dans le InstallerTruc.cs à l'intérieur de la classe tu copies simplement :
//enregistre l'assembly
public override void Install(System.Collections.
IDictionary stateSaver)
{

base.Install(stateSaver);

RegistrationServices reg =
newRegistrationServices();
reg.RegisterAssembly(
this.GetType().Assembly,
AssemblyRegistrationFlags.SetCodeBase);
}

//désenregistre l'assembly
public override void Uninstall(System.Collections.
IDictionary savedState)
{

RegistrationServices reg =
newRegistrationServices();
reg.UnregisterAssembly(
this.GetType().Assembly);

base.Uninstall(savedState);
}

ShareVB

Merci ShareVB 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de ShareVB
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 24 juil. 2007 à 20:12
0
Merci
Commenter la réponse de ShareVB
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 25 juil. 2007 à 09:47
0
Merci
Salut,

Merci pour l'information... je connais ce site... Si tu suis exactement ce qu'il dit, ça marche pas.

Merci pour la réponse,
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 25 juil. 2007 à 20:36
0
Merci
salut,

personnelement, je viens de tester et ca marche :
-> j'ai office 2007 d'installé et visual studio
-> j'ai copier ce code dans fichier Functions.cs :
using System;
using System.Runtime.InteropServices;

namespace NAddIn
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Functions
    {
        public Functions()
        {
        }

        public double AjouterAzerty(double v1, double v2)
        {
            return v1 + v2;
        }

        public int UnTioTest()
        {
            return 34;
        }

        [ComRegisterFunctionAttribute]
        public static void RegisterFunction(Type t)
        {
            Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(
                "CLSID\\{" + t.GUID.ToString().ToUpper() +
                   "}\\Programmable");
        }

        [ComUnregisterFunctionAttribute]
        public static void UnregisterFunction(Type t)
        {
            Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey(
                "CLSID\\{" + t.GUID.ToString().ToUpper() +
                  "}\\Programmable");
        }
    }
}
-> j'ai définit "Make COM visible" mais pas "Register for COM"
-> compilation puis j'ai mis la dll sur le bureau
-> regasm /codebase
-> dans office 2007 (quand j'ai fini par trouver le gestionnaire de complément), j'ai trouvé mon addin "NAddIn.Functions"
-> je l'ai sélectionné, le message "mscoree.dll" est apparu, j'ai répondu "non"
-> ensuite en saisissant =AjouterAzerty(3;4) dans une cellule ca marche...

en tout cas, si je fais parcourir puis que je sélectionne la dll, j'ai le message automation truc...

en fait, je pense que sur une autre machine, les comregisterfunction ne sont pas appellées :
-> est-ce que tu utilises regasm ?
-> si c'est un projet de déploiement, alors il me semble qu'il y a un bug dans l'appel des fonction comregister...

ShareVB
Commenter la réponse de ShareVB
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 26 juil. 2007 à 13:57
0
Merci
merci bcp ShareVB. ça fait un mois que je galère avec ça. J'ai posé plusieurs questions par tout et t'es la première personne qui me donne un réponse précise. j'ai résussi çà faire marcher le code sur ma machine. Le gros pb maintenant est de faire l'installation sur une autre machine. Je sais déjà qu'il faut installer le .Net2.0. Là, il y a un petit souci, car le add-in utilise le .NET 2.0 et Excel utilise .NET 1.1. Pour résoudre ce problème, il faut installer le patch office2003-KB907417-FullFile-ENU . Pour que les outils VSTO marchent, il faut aussi installer le runtime vstor .

Si j'essaye d'utiliser regasm, ça ne marche pas. Il ne reconnait pas la dll pour la registrer. Mais je ne sais pas comment résoudre ça. T'as une idée?

Merci inifiniment,
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 26 juil. 2007 à 22:43
0
Merci
salut,

qu'entends tu par "Regasm ne reconnait pas la dll pour la registrer" ? normalement tu fais un projet de déploiement, et tu indiques de l'enregistrer avec regasm dans une custom action...

sinon, tu peux mettre une custom action dans ta dll :
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Configuration.Install;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

namespace prjIEAddonSample
{
    /// <summary>
    /// Cette classe est nécessaire d'enregistrer l'assembly en appelant les ComRegisterFunction
    /// </summary>
    [RunInstaller(true)]
    public class TBInstaller : System.Configuration.Install.Installer
    {
        //enregistre l'assembly
        public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);
            RegistrationServices reg = new RegistrationServices();
            reg.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase);
        }
        //désenregistre l'assembly
        public override void Uninstall(System.Collections.IDictionary savedState)
        {
            RegistrationServices reg = new RegistrationServices();
            reg.UnregisterAssembly(this.GetType().Assembly);
            base.Uninstall(savedState);
        }
    }
}

ShareVB
Commenter la réponse de ShareVB
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 27 juil. 2007 à 09:17
0
Merci
Salut!

Merci bcp pour ta réponse....
Je pense que je l'ai fait...regard mon code:

using

System;
using

System.Runtime.InteropServices;
using

Microsoft.Win32;
//using Microsoft.VisualStudio.Tools.Applications.Runtime;

using

Excel = Microsoft.Office.Interop.Excel; 

namespace

AltiaD{

[

ClassInterface(
ClassInterfaceType.AutoDual),
ComVisible(
true)]

public
class
Functions{

public Functions(){

}

public
static
double pi = 3.141592654;

/// APPROXIMATION DE LA FONCTION DE REPARTITION DE LA LOI NORMALE

public
double N(
double d){

double a1 = 0.319381530;

double a2 = -0.356563782;

double a3 = 1.781477937;

double a4 = -1.821255978;

double a5 = 1.330274429;

double N;

if (d > 0){
double x 1 / (1 + 0.2316419 * d);N 1 - (1 /

Math.Sqrt(2 * pi) *
Math.Exp(-
Math.Pow(d, 2) / 2)) * (a1 * x + a2 *
Math.Pow(x, 2) + a3 *
Math.Pow(x, 3) + a4 *
Math.Pow(x, 4) + a5 *
Math.Pow(x, 5));}

else
if (d == 0){

N = 0.5;

}

else{

double x = 1 / (1 + 0.2316419 * (-d));

double temp = 1 - (1 /
Math.Sqrt(2 * pi) *
Math.Exp(-
Math.Pow(d, 2) / 2)) * (a1 * x + a2 *
Math.Pow(x, 2) + a3 *
Math.Pow(x, 3) + a4 *
Math.Pow(x, 4) + a5 *
Math.Pow(x, 5));N = 1 - temp;

}

return (N);}

 

/// N'(x)

public
double N2(
double d,
double sigma,
double r){

double N2 = 1 / (sigma *
Math.Sqrt(2 * pi)) *
Math.Exp(-
Math.Pow(d - r, 2) / (2 *
Math.Pow(sigma, 2)));

return (N2);}

 

 

// CALCUL DU PRIX D UN CALL PAR BLACK&SCHOLES

public
double call(
double s,
double k,
double r,
double t,
double sigma,
double d){

double call;t = t / 365.25;

double st = s *
Math.Exp(-d * t);

double d1 = 1 / (sigma *
Math.Sqrt(t)) * (
Math.Log(st / k) + (r + 1 / 2 *
Math.Pow(sigma, 2)) * t);

double d2 = d1 - sigma *
Math.Sqrt(t);call = st * N(d1) - k *

Math.Exp(-r * t) * N(d2);

return (call);}

 

// CALCUL DU PRIX D UN PUT PAR BLACK&SCHOLES

public
double put(
double s,
double k,
double r,
double t,
double sigma,
double d){

double put;t = t / 365.25;

double st = s *
Math.Exp(-d * t);

double d1 = 1 / (sigma *
Math.Sqrt(t)) * (
Math.Log(st / k) + (r + 1 / 2 *
Math.Pow(sigma, 2)) * t);

double d2 = d1 - sigma *
Math.Sqrt(t);put = -st * N(-d1) + k *

Math.Exp(-r * t) * N(-d2);

return (put);}

 

[

ComRegisterFunctionAttribute]

public
static
void RegisterFunction(
Type t){

Microsoft.Win32.

Registry.ClassesRoot.CreateSubKey(

"CLSID\\{" + t.GUID.ToString().ToUpper() +

"}\\Programmable"); 

}

[

ComUnregisterFunctionAttribute]

public
static
void UnregisterFunction(
Type t){

Microsoft.Win32.

Registry.ClassesRoot.DeleteSubKey(

"CLSID\\{" + t.GUID.ToString().ToUpper() +

"}\\Programmable");}

}

}

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 27 juil. 2007 à 21:01
0
Merci
salut,

ton code me semble OK, seulement, je pense que ton projet de déploiement n'appelle pas les comregisterfunction ce qui fait que tu ne vois pas l'addin...normaleme, regasm.exe fait tout bien mais je ne sais pas si tu peux l'utiliser sans le SDK de développement...j'ai eu des prb avec les projets de déploiement qui ne semble pas appeler à tous les coups les comregisterfunction...

donc si tu emploies un projet de déploiement (ce que je te conseilles), tu ajoutes une classe Installer dans ta dll, tu copies le code de mon précédent post à la place du code généré dans la classe installer, dans ton projet tu ajoutes une custom action pour Install et Uninstall en laissant InstallerClass = True...

ShareVB
Commenter la réponse de ShareVB
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 30 juil. 2007 à 14:40
0
Merci
Salut,

Merci pour ta réponse ShareVB! Je pense que t'as raison. Mon déploiement n'appelle pas les comregisterfunction. J'ai crée un setup Project, puis j'ai insérer une classe nomée Installer. Ensuite j'ai copié ton code. Par contre, je n'ai pas trouvé le InstallerClass = True. C'est quoi ça? Une autre question: Dans le custom action, je demande d'ajouter une action personalisée sur installer. Il m'ouvre les options suivantes: 1. Bureau de l'utilisateur; 2. dossier d'application; 3. Menu Programmes de l'utilisateur. A partir de là je ne sais pas quoi faire.
Merci bcp pour ton aide,
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 30 juil. 2007 à 22:54
0
Merci
salut,

1) Installer = true c'est une fois que tu as crées ta custom action sur Install et Uninstall, c'est dans les propriétés de la custom action sélectionnée

2) "1. Bureau de l'utilisateur; 2. dossier d'application; 3. Menu Programmes de l'utilisateur", c'est un peu comme un OpenFileDialog...tu vas dans "dossier d'application" et tu cliques sur "sortie primaire..."/"Primary output from ton_projet"...et là ca t'ajoutes une custom action sur laquelle tu vérifies le Installer = true dans les prop...

ShareVB
Commenter la réponse de ShareVB
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 30 juil. 2007 à 22:57
0
Merci
salut,

si c'est OK je mettrais un code et un tuto pour expliquer tout ca...en fait, le lien que je mentionnais dans mon premier post donne la méthode juste, mais ca peut être mal interprété et il n'y a effectivement rien sur le déploiement car tout le monde crois que le déploiement c'est tjs facile...

ShareVB
Commenter la réponse de ShareVB
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 31 juil. 2007 à 10:49
0
Merci
Salut!

J'ai suivi les pas. Il a crée deux onglets: installer2.cs et installer2.designer.cs. J'ai collé ton texte sur installer2.cs

voici le code de installer2.cs :
using

System;

using System.Collections.Generic;

using System.Text;

using System.ComponentModel;

using System.Configuration.Install;

using System.Windows.Forms;

using System.IO;

using System.Runtime.InteropServices;
namespace

AltiaD
{
[
RunInstaller(
true)]

///<summary>
/// Cette classe est nécessaire d'enregistrer l'assembly en appelant les ComRegisterFunction
///</summary>
[
RunInstaller(
true)]

public
class
TBInstaller : System.Configuration.Install.
Installer
{

//enregistre l'assembly
public
override
void Install(System.Collections.
IDictionary stateSaver)
{

base.Install(stateSaver);

RegistrationServices reg =
new
RegistrationServices();
reg.RegisterAssembly(
this.GetType().Assembly,
AssemblyRegistrationFlags.SetCodeBase);
}

//désenregistre l'assembly
public
override
void Uninstall(System.Collections.
IDictionary savedState)
{

RegistrationServices reg =
new
RegistrationServices();
reg.UnregisterAssembly(
this.GetType().Assembly);

base.Uninstall(savedState);
}
}
}
voici le code installer2.designer.cs:

namespace

AltiaD
{

partial
class
Installer2
{

///<summary>
/// Variable n‚cessaire au concepteur.
///</summary>
private System.ComponentModel.
IContainer components =
null;

///<summary>
/// Nettoyage des ressources utilis‚es.
///</summary>
///true si les ressources manag‚es doivent ˆtre supprim‚esÿ; sinon, false.

protected
override
void Dispose (
bool disposing)
{

if (disposing && (components ! =
null))
{
components.Dispose();
}

base.Dispose(disposing);
}

#region Code g‚n‚r‚ par le Concepteur de composants

///<summary>
/// M‚thode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette m‚thode avec l'‚diteur de code.
///</summary>
private
void InitializeComponent()
{
components =
new System.ComponentModel.
Container();
}

#endregion
}
}

Quand je génère, j'obtient l'erreur suivant: Erreur 1 'AltiaD.Installer2.Dispose(bool)' : aucune méthode appropriée n'a été trouvée pour la   substitution C:\OTAVIO\AltiaD\AltiaD\Installer2.Designer.cs 14 33 AltiaD.
J'ai marqué l'erreur sur le code: c'est le mot "Dispose" en rouge.

Je suis en train de faire de bêtises, svp?

merci bcp
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 1 août 2007 à 12:40
0
Merci
Merci bcp ShareVB!

J'ai tout fait, puis j'ai généré la solution et j'ai crée le setup. Jusqu'à là tout ok.

Je l'ai installé sur un autre ordinateur qui avait déjà le .NET 2.0, le interop, le runtime vstor. J'ouvre Excel, mais je ne vois pas l'automation add-in dans la liste. Je ne comprend pas pourquoi ça ne marche toujours pas. T'as une idée, stp?

MErci encore une fois,
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Dernière intervention
4 mars 2008
- 1 août 2007 à 16:26
0
Merci
Excuse moi!! C'est moi qui avais fait une betise.... ça a marché!!!! Merci bcp ShareVB! ça fait plusieurs semaines que je cherchais une solution par tout!

Merci infiniment,
Otavio Reis
Commenter la réponse de otavioreis
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Dernière intervention
13 janvier 2016
- 20 sept. 2007 à 19:29
0
Merci
salut,

je viens de mettre un tutoriel sur le sujet : http://www.csharpfr.com/tutorial.aspx?ID=743

ShareVB
Commenter la réponse de ShareVB

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.