2010-04-15 8 views
1

J'ai créé une application simple .NET Class qui convertit une feuille de calcul Excel en un fichier pdf. Je reçois ensuite une application Excel 2007 pour appeler cette DLL qui fonctionne très bien sur ma machine de développement.Erreur d'exécution '429' Le composant activex ne peut pas créer d'objet.

Cependant, quand je le déployer sur une machine Vista, qui a à la fois le cadre de .net et Excel 2007, je reçois cette erreur:

run-time error '429' activex component can't create object 

Même si je suis un administrateur sur la machine, je ne peut pas sembler mettre des dlls .net signés dans le GAC. Est-ce que quelqu'un peut m'aider s'il vous plaît à résoudre ce problème?

Voici comment j'appelle .net fichier tlb à partir d'Excel 2007.

Sub TestSub()<br> 
&nbsp;Dim printLibraryTest As PrintLibrary.Print<br> 
&nbsp;Set printLibraryTest = New PrintLibrary.Print <br> 
&nbsp; printLibraryTest.ConvertExcelToPdf <br> 
End Sub <br> 

Cette bibliothèque est .net ci-dessous.

using System;<br> 
using System.Collections.Generic;<br> 
using System.Runtime.InteropServices;<br> 
using System.Text;<br> 
using Microsoft.Office.Interop.Excel;<br><br> 

namespace PrintLibrary<br> 
{<br> 
    [ClassInterface(ClassInterfaceType.None)]<br> 
    [Guid("3d0f04d2-9123-48e0-b12f-6c276ff2281b")]<br> 
    [ProgId("PrintLibrary.Test")]<br> 
    public class Print<br> 
    {  <br> 
     public void ConvertExcelToPdf(string inputFile,string outputFile) <br> 
     { <br> 
      &nbsp;&nbsp; ApplicationClass excelApplication = new ApplicationClass(); <br> 
      &nbsp;&nbsp; Workbook excelWorkBook = null; <br> 
      &nbsp;&nbsp; string paramSourceBookPath = inputFile; <br> 
      &nbsp;&nbsp; object paramMissing = Type.Missing; <br> 

      string paramExportFilePath = outputFile; 
      XlFixedFormatType paramExportFormat = XlFixedFormatType.xlTypePDF; 
      XlFixedFormatQuality paramExportQuality = 
      XlFixedFormatQuality.xlQualityStandard; 
      bool paramOpenAfterPublish = false; 
      bool paramIncludeDocProps = true; 
      bool paramIgnorePrintAreas = true; 
      object paramFromPage = Type.Missing; 
      object paramToPage = Type.Missing; 


      try 
      { 
       // Open the source workbook. 
       excelWorkBook = excelApplication.Workbooks.Open(paramSourceBookPath, 
       paramMissing, paramMissing, paramMissing, paramMissing, 
       paramMissing, paramMissing, paramMissing, paramMissing, 
       paramMissing, paramMissing, paramMissing, paramMissing, 
       paramMissing, paramMissing); 

       // Save it in the target format. 
       if (excelWorkBook != null) 
        excelWorkBook.ExportAsFixedFormat(paramExportFormat, 
        paramExportFilePath, paramExportQuality, 
        paramIncludeDocProps, paramIgnorePrintAreas, paramFromPage, 
        paramToPage, paramOpenAfterPublish, 
        paramMissing); 
      } 
      catch (Exception ex) 
      { 
       // Respond to the error. 
      } 

Enfin

  { 
       // Close the workbook object. 
       if (excelWorkBook != null) 
       { 
        excelWorkBook.Close(false, paramMissing, paramMissing); 
        excelWorkBook = null; 
       } 

       // Quit Excel and release the ApplicationClass object. 
       if (excelApplication != null) 
       { 
        excelApplication.Quit(); 
        excelApplication = null; 
       } 

       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
      } 
     } 
    } 
} 
+1

Je suppose que votre 'PrintLibrary.dll' a été construit en utilisant .NET? At-il des classes ou des interfaces COM-visibles? Si non, alors pas besoin de s'inscrire. Si oui, je suppose que vous utilisez RegAsm pour l'enregistrer, ou essayez-vous (incorrectement) d'utiliser RegSvr32? Lorsque vous exécutez votre code et que vous obtenez "erreur d'exécution 429", le composant activex ne peut pas créer d'objet ", quelle est la ligne de code? (C'est-à-dire, quel objet essaye-t-il de créer - êtes-vous sûr que c'est quelque chose de votre 'PrintLibrary.dll?) –

+0

Salut Mike, merci de revenir à moi sur ce sujet. Je crée une référence à la bibliothèque .net tlb créée par Visual Studio. Il semble casser sur cette ligne ... printLibraryTest.ConvertExcelToPdf. Dois-je toujours utiliser Regasm, même si Visual Studio a créé une bibliothèque tlb? J'utilise aussi ClassInterface (ClassInterfaceType.None, donc aucune interface de classe n'est générée pour la classe. – Kojof

Répondre

1

Un an plus tard ...

Est-il possible que cela peut être dû à la même raison que cela: http://support.microsoft.com/kb/313984/en-us

L'erreur se produit parce que le l'ordinateur cible ne dispose pas des informations de licence pour les objets de contrôle utilisés dans l'application [...] Cela générerait un package d'installation contenant le corre Version ct du contrôle Winsock. Toutefois, la clé de licence pour le contrôle ne sera pas compilée dans l'application, sauf si une instance du contrôle est placée sur un formulaire. Lorsque vous essayez d'instancier les objets lors de l'exécution, l'application n'a aucun moyen de fournir la clé de licence et le code échoue. Par exemple, le code suivant s'exécutera correctement au moment du design, mais échouera au moment de l'exécution sur les ordinateurs sur lesquels Visual Basic n'est pas installé.

Il semble y avoir une relation avec votre cas ici:

  • numéro d'erreur même et le message
  • Happens en même temps: lorsque vous déployez à une machine non dev

Le solution de contournement semble placer le contrôle sur un formulaire.


Vérifiez cet article aussi: Run-time error '429'

Questions connexes