none
Add-In Entwicklung für Office 2002 mit Visual Studio 2008 RRS feed

  • Frage

  • Hallo,

    Was muss ich alles tun, um Office 2002 (insbesondere Excel 2002) so in Visual Studio 2008 (Professional Edition) zu integrieren, damit ich Add-Ins für Office 2002 (bzw. Excel 2002) entwickeln kann? Gibt es irgendwo eine existierende Übersicht über die notwendigen Schritte?
    Dienstag, 3. November 2009 13:04

Antworten

  • Hallo e_l_,

    eine direkte Unterstützung durch Visual Studio in der Form von Projektvorlagen gibt es für Office 2002 nicht. Die Visual Studio Tools für Office gab es erstmals für Visual Studio 2005 und Office 2003. Für 2002 musst du von Hand programmieren. Für COM kannst du VB6 nutzen oder Visual C++. Verwaltet mit VB.NET oder C# funktioniert ebenfalls.

    Einen Start findest du hier http://support.microsoft.com/ph/1743/de?sid=63

    Viele Grüße
    Jan
    Dienstag, 3. November 2009 13:34
  • Hallo e_I_,

    Office 2002 hat offiziell keine .Net unterstützung.
    Allerdings kann man in Visual Studio unter "Andere Vorlagen" ein sog. Shared Add-in erstellen.

    Jedoch: Es gibt keine offiziellen Primary Interop Assemblies für Office 2002.
    Diese müsstest Du also erstellen, signieren und mit ausliefern (wird glaube ich automatisch erstellt, wenn man im Projekt die Referenzen zu den COM Libraries) hinzufügt.  Ferner benötigtst Du einen sog. COM Shim. Dafür gibt es einen Wizard, den man sich bei Microsoft herunterladen kann.

    Excel 2002 is so alt - dass ich Dir als VSTO-Programmierer nur dringend raten kann -> Upgraden auf eine aktuelle Version(Office 2007).

    Sonst ist VB6 zum Erstellen eines Add-ins wirklich die beste Lösung.

    Gruß, Helmut 
    Helmut Obertanner [http://www.x4u.de] [http://www.outlooksharp.de]
    Mittwoch, 4. November 2009 15:23
  • Hallo e_I_,

    glücklicher Weise habe ich mich auch schon mit genau diesem Fehler rumgeschlagen, also würd ich tippen dass ich dir helfen kann. Allerdings habe ich für Excel 2003 entwickelt.
    Ein Automatisierungsserver ist ein ja wie bekanntlich auch ein Add-In, benötigt wie schon erörtert Registrierungseinträge.
    Da ich aber leider keine Ahnung habe, ob es da noch diverese Unterschiede zwischen Excel 2002 und 2003 in Bezug auf Automatisierungsserver gibt, hoffe ich dass es trotzdem funktioniert.

    Ich werde dir mal ein Beispiel geben, welches aber in VB.Net geschrieben ist:

    <ClassInterface(ClassInterfaceType.AutoDual), ComVisible(True), ProgId("MyAutomation")> _
    Public Class Automation

    'Nach erfolgreicher Registrierung wird man diese Funktion später in der Excel-Funktionsliste sehen
         Public Function Addieren(ByVal a as double, ByVal b as double) as Double
            return a+b
         End Function

    'Die Standart-Funktionen ausblenden ( "GetType"-Funktion auszublenden ist nicht möglich, da diese keine Overide-Funktion ist. )
    'Das ist aber nicht zwingend erforderlich
        <ComVisible(False)> _
        Public Overrides Function ToString() As String
            Return "MyAutomation"
        End Function

        <ComVisible(False)> _
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            Return MyBase.Equals(obj)
        End Function

        <ComVisible(False)> _
        Public Overrides Function GetHashCode() As Integer
            Return MyBase.GetHashCode()
        End Function

    'Nun der wichtigste Teil...
    'COM-Registrierungsfunktion für den Eintrag in die Windows-Registry
        <ComRegisterFunction()> _
        Public Shared Sub RegisterClass(ByVal t As Type)
            Dim key As RegistryKey = _
            Registry.ClassesRoot.CreateSubKey("CLSID\{" & t.GUID.ToString().ToUpper() & "}")
            key.CreateSubKey("Programmable")
            key.SetValue("", "My Automation")
            key.CreateSubKey("InprocServer32\").SetValue("", GetFolderPath(SpecialFolder.System) & "\mscoree.dll")
            key = Registry.ClassesRoot.CreateSubKey("MyAutomation")
            key.SetValue("", "My Automation")
        End Sub

    End Class


    Das sollte jetz schon ausreichen, aber es fehlt noch ein weiterer Schritt. Du musst mit RegAsm über die Visual Studio 2008 Eingabeaufforderung nun noch die Assembly "effektiv" am System registrieren.
    Starte die Eingabeaufforderung von VS 2008 (Start -> Programme -> VS 2008 -> VS Tools) und wechsele in das Verzeichnis, wo du deine erstellte Dll liegen hast und gib folgendes ein:

    regasm DerAssemblyName.dll

    Du wirst wahrscheinlich einen Fehler bekommen, weil ein "Starker Name" fehlt, aber es sollte trotzdem registriert werden. Möchtest du den Fehler nicht haben, dann füge deinem Projekt über die Projekteigenschaften noch einen Signierungsschlüssel hinzu. Ein Passwort ist dafür nicht notwendig.

    Hast du das soweit geschafft und es hat (hoffentlich) alles funktioniert, dann startest du Excel und fügst den Automatisierungsserver hinzu, ohne das die Fehlermeldeung kommt. Anschliessen sollte die Funktion "Addieren" nutzbar sein.

    Für eine öffentliche Publikation bräuchtest du dann ein Setup, welches dann diese Registrierungsschritte übernimmt. Aber da kannst du ja dann später nochmal fragen, falls mein Beispiel funktionieren sollte ;)...da es ja, wie schon gesagt, für Excel 2003 ist.


    Grüße
    Mittwoch, 2. Dezember 2009 08:06

Alle Antworten

  • Hallo e_l_,

    eine direkte Unterstützung durch Visual Studio in der Form von Projektvorlagen gibt es für Office 2002 nicht. Die Visual Studio Tools für Office gab es erstmals für Visual Studio 2005 und Office 2003. Für 2002 musst du von Hand programmieren. Für COM kannst du VB6 nutzen oder Visual C++. Verwaltet mit VB.NET oder C# funktioniert ebenfalls.

    Einen Start findest du hier http://support.microsoft.com/ph/1743/de?sid=63

    Viele Grüße
    Jan
    Dienstag, 3. November 2009 13:34
  • Hallo e_I_,

    Office 2002 hat offiziell keine .Net unterstützung.
    Allerdings kann man in Visual Studio unter "Andere Vorlagen" ein sog. Shared Add-in erstellen.

    Jedoch: Es gibt keine offiziellen Primary Interop Assemblies für Office 2002.
    Diese müsstest Du also erstellen, signieren und mit ausliefern (wird glaube ich automatisch erstellt, wenn man im Projekt die Referenzen zu den COM Libraries) hinzufügt.  Ferner benötigtst Du einen sog. COM Shim. Dafür gibt es einen Wizard, den man sich bei Microsoft herunterladen kann.

    Excel 2002 is so alt - dass ich Dir als VSTO-Programmierer nur dringend raten kann -> Upgraden auf eine aktuelle Version(Office 2007).

    Sonst ist VB6 zum Erstellen eines Add-ins wirklich die beste Lösung.

    Gruß, Helmut 
    Helmut Obertanner [http://www.x4u.de] [http://www.outlooksharp.de]
    Mittwoch, 4. November 2009 15:23
  • Hallo Helmut,

    -->Jedoch: Es gibt keine offiziellen Primary Interop Assemblies für Office 2002.

    Hm, stimmt das so? Was lade ich dann unter http://www.microsoft.com/downloads/details.aspx?FamilyID=c41bd61e-3060-4f71-a6b4-01feba508e52&DisplayLang=en herunter?

    @e_l_: Wie dem auch sei, wenn du Add-Ins entwickeln möchtest, würde ich dir wie Helmut Office 2007 empfehlen oder zumindest Office 2003 einsetzen.

    Viele Grüße
    Jan
    Mittwoch, 4. November 2009 17:24
  • Hallo Jan,
    ups - mein Fehler.
    Stimmt - die ersten PIA's gabs für Office XP(2002).

    Da hast Du natürlich Recht.
    Helmut Obertanner [http://www.x4u.de] [http://www.outlooksharp.de]
    Mittwoch, 4. November 2009 18:32
  • Bzgl. Office 2003/2007: Ich muss abklären, ob das eine Option ist. Leider haben wir hier im Haus noch Office 2002, und das Add-In soll am Ende nicht bloss intern genutzt werden sondern als Gratisdownload angeboten werden - dies für eine Branche, in welcher du vermutlich eher froh sein kannst, wenn die Leute überhaupt schon mit Office 2002 arbeiten und nicht mit noch älteren Office-Versionen. ;)


    Zum Rest:
    Also die Office XP PIAs habe ich bereits runtergeladen und aus meinem Projekt heraus referenziert. Momentan kämpfe ich mit dem Fehler:

    "The file you selected does not contain a new Automation Server, or you do not have sufficient privileges to register the Automation Server"

    Er erscheint jedesmal, wenn ich unter Excel das Automation Add-In als DLL hinzufügen will. Nur ein einziges Mal erschien der Fehler nicht, da wurde dann jedoch die Datei mscoree.dll vermisst (ist unter C:\Windows\System32\mscoree.dll zu finden). Leider kann ich diesen Fall jedoch nicht mehr wiederherstellen, was ich da genau getan habe, weiss ich auch nicht.

    Gemäss dieser Webseite - http://www.codeproject.com/KB/COM/excelnetauto.aspx- müsste das der Fall sein, weil meine DLL nicht in der Registry drin ist. Allerdings wähle ich in VisualStudio unter dem Properties meines Projekts --> Build --> Register for COM Interop mit aus. Kann mir die Sache also nicht so recht erklären.
    Donnerstag, 5. November 2009 09:07
  • Was ich auch nicht so recht weiss (komme nicht aus der .NET-Welt): Wenn ich in der Registry was ändere (z.B. mittels regedit), muss ich dann regedit zuerst schliessen, damit die Änderung überhaupt aktiv wird oder nicht? Und Excel? Und VisualStudio?
    Donnerstag, 5. November 2009 09:13
  • Hallo,

    das könnte bedeuten, dass deine DLL nicht COM-Visible ist, b.z.w. nicht in der Registry registriert ist - oder aber Die Guid's falsch sind, oder Du eine COM-Shim erstellt hast, welche aber nicht korrekt funktioniert.

    Zum registrieren der DLL:
    wenn man eine COM-DLL auf einem System registrieren möchte, benötigt man auf jeden Fall Administratorrechte. Da hier Regsitryeinträge in HKLM geschrieben werden. z.B.: die ClassID und die ProgID

    Ich kenne den Artikel leider nicht.
    Jedoch würde ich auf jeden Fall empfehlen mit deinem Problem in die Office Automation Newsgroup zu posten.
    Das hat mit VSTO leider nichts zu tun - ich glaube in der Office Automation Newsgroup bist Du besser aufgehoben.

    Ich würde Dir eventuell auch empfehlen, Dir mal die Add-In Expess-Lösung anzusehen.
    Das wäre für deine Zwecke eventuell die bessere Lösung - VSTO leider nicht.

     
    http://www.add-in-express.com/

    Gruß, Helmut
    Helmut Obertanner [http://www.x4u.de] [http://www.outlooksharp.de]
    Donnerstag, 5. November 2009 14:29
  • Hallo Helmut,

    Danke für die Tipps, ich werde beide Vorschläge ausprobieren. Zu deiner Antwort:

    Die GUIDs habe ich mittels des GUI-Tools von VisualStudio erstellt. In VisualStudio habe ich in den Projekt-Properties sowohl bei --> Build die Option Register for COM Interop ausgewählt, als auch unter --> Application --> Assembly-Information --> Make Assembly COM visible ausgewählt. In der Registry finde ich tatsächlich den entsprechenden Eintrag.

    Zur Sicherheit habe ich sogar im Code noch einmal das Attribut [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)] auf die Klasse gesetzt. Ich habe im Internet einige Threads gefunden, in welchen auf diese Fehlermeldung eingegangen wurde, aber keine der dort vorgeschlagenen Lösungen hat mir bisher geholfen.
    Donnerstag, 5. November 2009 14:52
  • Hallo,

    prüfe bitte doch mal, ob Du in deiner AssemblyInfo.cs folgenden Eintrag hast (natürlich mit einer eigenen Guid)

    // The following GUID is for the ID of the typelib if this project is exposed to COM

    [

    assembly: Guid("b7c60b06-4dbe-4fd3-9652-403966b5fd32")]

    Damit legt man die ID der library fest.
    Wenn Du das nicht hast, ändert sich diese ab u. zu.
    Die muss auf jeden Fall für das Projekt stabil bleiben.

    Gruß, Helmut


    Helmut Obertanner [http://www.x4u.de] [http://www.outlooksharp.de]
    Donnerstag, 5. November 2009 16:33
  • Hallo zusammen,

    haben wir hier vielleicht übersehen, dass die XP-PIAs und die .NET-Programmierunterstützung in Office XP auf .NET Framwork 1.1 basieren? Ich habe nämlich nochmal zu dem Thema recherchiert und es ist auch immer von Visual Studio .NET die Rede... 1.1 wird als Ziel von VS 2008 aber nicht unterstützt. Leider habe ich gerade keine entsprechende Umgebung aufgesetzt, um das zu testen bzw. zu klären. Aber die Kombination XP/VS2008 scheint nicht zu funktionieren. Das würde auch den Fehler mit der mscoree.dll erklären.

    Viele Grüße
    Jan
    Freitag, 6. November 2009 09:56
  • @Helmut:
    Die GUID ist in AssemblyInfo.cs enthalten. Ich habe jedoch auch auf der Klasse eine (andere) GUID definiert.
    Montag, 9. November 2009 08:15
  • @Jan:
    Das könnte durchaus sein. Ein Freund hat mich auf folgenden Artikel aufmerksam gemacht: http://support.microsoft.com/?scid=kb%3Ben-us%3B948461&x=17&y=13
    Ich habe die Vorgaben des Artikels gefolgt - womöglich war es das, was den Fehler mit der fehlenden mscoree.dll behoben hat, denn dieser tritt inzwischen nicht mehr auf. Der andere Fehler "The file you selected does not contain a new Automation Server, or you do not have sufficient privileges to register the Automation Server" erscheint jedoch noch immer.


    Hier einmal eine Übersicht darüber, was ich alles unternommen habe (habe das in der Newsgroup für Office-Automation gepostet, aber noch keine Rückmeldung erhalten):

    1. I am working as the Administrator.

    2. In VS under the project's properties I have made the following settings
        --> Application "Target Framework = .NET Framework 2.0"
        --> Application --> Assembly Information "Make assembly COM-visible" is
    checked
        --> Build --> "Register for COM Interop" is checked

    3. After Building, the GUID can indeed be found in the registry as a key,
    pointing to the correct .dll. By the way: The GUID was made using the Visual
    Studio GUID-Tool.

    4. In the code, I have set the following Labels/Attributes/whatever they're
    called in .NET to my class [ComVisible(true),
    ClassInterface(ClassInterfaceType.AutoDual),
    Guid("F6AD0710-C59D-4f82-AE7C-071926597DE5")]

    5. Somewhere in a thread I have read that Excel 2002 needs a file called
    C:\Program Files\Microsoft Office\Office10\Excel.exe.config containing the
    following piece of XML:
        [?xml version="1.0" ?]
            [configuration]
                [startup]
                    [supportedRuntime version="v2.0.50727"/]
                [/startup]
            [/configuration]
    So I put it there.

    6. Somewhere I have read that if you've installed several .NET-Frameworks
    the registry has to point to the correnct one:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework --> InstallRoot =
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\

    7. As a friend suggested, I followed this article:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B948461&x=17&y=13 .

    8. For some time, when trying to add the Add-In in Excel, I recieved the
    error message that mscoree.dll was missing. This I solved somehow, but
    cannot remember exactly how. (I certainly did not download the file and put
    it somewhere.)
    Montag, 9. November 2009 08:19
  • Hallo,

    ich hänge hier gerade auch etwas. Hast du denn mal .NET 1.1 installiert? Kommt dann derselbe Fehler?

    Gruß
    Jan
    Montag, 9. November 2009 18:34
  • Ich war leider nicht in der Lage, das Problem zu lösen. Wir haben uns entschieden, statt für Office 2002 zu entwickeln, geradewegs auf Office 2007 zu gehen, da sowieso in absehbarer Zeit intern das neue Office ausgeliefert wird.
    Dienstag, 1. Dezember 2009 12:59
  • Hallo e_I_,

    glücklicher Weise habe ich mich auch schon mit genau diesem Fehler rumgeschlagen, also würd ich tippen dass ich dir helfen kann. Allerdings habe ich für Excel 2003 entwickelt.
    Ein Automatisierungsserver ist ein ja wie bekanntlich auch ein Add-In, benötigt wie schon erörtert Registrierungseinträge.
    Da ich aber leider keine Ahnung habe, ob es da noch diverese Unterschiede zwischen Excel 2002 und 2003 in Bezug auf Automatisierungsserver gibt, hoffe ich dass es trotzdem funktioniert.

    Ich werde dir mal ein Beispiel geben, welches aber in VB.Net geschrieben ist:

    <ClassInterface(ClassInterfaceType.AutoDual), ComVisible(True), ProgId("MyAutomation")> _
    Public Class Automation

    'Nach erfolgreicher Registrierung wird man diese Funktion später in der Excel-Funktionsliste sehen
         Public Function Addieren(ByVal a as double, ByVal b as double) as Double
            return a+b
         End Function

    'Die Standart-Funktionen ausblenden ( "GetType"-Funktion auszublenden ist nicht möglich, da diese keine Overide-Funktion ist. )
    'Das ist aber nicht zwingend erforderlich
        <ComVisible(False)> _
        Public Overrides Function ToString() As String
            Return "MyAutomation"
        End Function

        <ComVisible(False)> _
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            Return MyBase.Equals(obj)
        End Function

        <ComVisible(False)> _
        Public Overrides Function GetHashCode() As Integer
            Return MyBase.GetHashCode()
        End Function

    'Nun der wichtigste Teil...
    'COM-Registrierungsfunktion für den Eintrag in die Windows-Registry
        <ComRegisterFunction()> _
        Public Shared Sub RegisterClass(ByVal t As Type)
            Dim key As RegistryKey = _
            Registry.ClassesRoot.CreateSubKey("CLSID\{" & t.GUID.ToString().ToUpper() & "}")
            key.CreateSubKey("Programmable")
            key.SetValue("", "My Automation")
            key.CreateSubKey("InprocServer32\").SetValue("", GetFolderPath(SpecialFolder.System) & "\mscoree.dll")
            key = Registry.ClassesRoot.CreateSubKey("MyAutomation")
            key.SetValue("", "My Automation")
        End Sub

    End Class


    Das sollte jetz schon ausreichen, aber es fehlt noch ein weiterer Schritt. Du musst mit RegAsm über die Visual Studio 2008 Eingabeaufforderung nun noch die Assembly "effektiv" am System registrieren.
    Starte die Eingabeaufforderung von VS 2008 (Start -> Programme -> VS 2008 -> VS Tools) und wechsele in das Verzeichnis, wo du deine erstellte Dll liegen hast und gib folgendes ein:

    regasm DerAssemblyName.dll

    Du wirst wahrscheinlich einen Fehler bekommen, weil ein "Starker Name" fehlt, aber es sollte trotzdem registriert werden. Möchtest du den Fehler nicht haben, dann füge deinem Projekt über die Projekteigenschaften noch einen Signierungsschlüssel hinzu. Ein Passwort ist dafür nicht notwendig.

    Hast du das soweit geschafft und es hat (hoffentlich) alles funktioniert, dann startest du Excel und fügst den Automatisierungsserver hinzu, ohne das die Fehlermeldeung kommt. Anschliessen sollte die Funktion "Addieren" nutzbar sein.

    Für eine öffentliche Publikation bräuchtest du dann ein Setup, welches dann diese Registrierungsschritte übernimmt. Aber da kannst du ja dann später nochmal fragen, falls mein Beispiel funktionieren sollte ;)...da es ja, wie schon gesagt, für Excel 2003 ist.


    Grüße
    Mittwoch, 2. Dezember 2009 08:06