none
Regfree COM einer .NET-COM-dll mittels Activation Context API unter VB6/VBA

    Frage

  • Hallo!

    Ich würde gerne eine .net-COM-dll unter VBA ohne Registrierung nutzen.

    Mit einer VB6.exe klappt das ohne Probleme, wenn die dll-Dateien im gleichen (oder einem untergeordneten) Verzeichnis wie die exe-Datei liegen.

    Ich kann unter VBA auch ohne Probleme eine COM-dll verwenden, die mit VB6 erstellt wurde.
    Verwende ich allerdings die .net-com-dll, kommt es bei "set obj = actCtx.CreateObject("NetComClassLibrary.Info")" zur Fehlermeldung "Die Methode 'CreateObject' für das Objekt 'IActCtx' ist fehlgeschlagen".

    Code-Auszug (VBA/Access):

    Set actCtx = CreateObject("Microsoft.Windows.ActCtx")
    actCtx.manifest = CurrentProject.Path & "\NetComClassLibrary.manifest"
    Set obj = actCtx.CreateObject("NetComClassLibrary.Info")

    Obiger Code läuft ohne Probleme mit einer VB6-COM-dll.

    Ich nehme an, dass ich für die .net noch "Codebase" o. ä. angeben muss. Die Frage ist nur wo und wie? ;-)

    LG
    Josef

    PS: @Moderatoren: ich war mir nicht sicher in welches Forum das am besten passt. Da es mit einer VB6-Com funktioniert - aber mit einer .NET-COM nicht, gehe ich zumindest davon aus, dass es etwas .net-spezifisches ist und wählte dieses Forum. ;)


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen Virtueller Access-Stammtisch



    Sonntag, 19. Februar 2012 10:50

Antworten

Alle Antworten

  • Hallo!

    Gibt es eine Möglichkeit, dass man eine mit MS.net erstelle .net-COM-dll unter VB6 oder VBA verwendet, ohne die dll mit regasm registrieren zu müssen? Die dll sollte in Umgebungen eingesetzt werden, wo kein Admin-Recht für die Registrierung vorhanden ist.
    Nutzen würde ich diese MS.net-COM hauptsächlich für VBA-Code in Access.

    Mit "normalen" VB6-Com-dlls ist das kein Problem (z. B. mit DirectCOM von Olaf Schmidt).

    Ich fand zwar viele Seiten mit dem Stichwort "Regfree COM" - kann das aber nicht für ein MS.net-COM-dll umsetzen, die in VBA(VB6) verwendet werden soll.

    Derzeit bin ich der Meinung, dass mein Vorhaben nicht möglich ist. Kann mir das bitte ein "VB6/MS.net/COM"-Profi bestätigen?
    Noch lieber wäre mir natürlich eine Erklärung, wie es doch möglich wird, eine MS.net-COM unter VBA ohne Registrierung zu verwenden. :-)

    Eigentlich wäre es mir sogar egal, ob die .net-dll COM-sichtbar ist. Ich würder nur gerne eine dll mit MS.net erstellen und dann in VBA verwenden. (Dabei kann ich mir momentan nicht vorstellen, dass das ohne COM möglich ist.)

    mfg
    Josef

    PS: Ich hoffe, dass ich das passende Forum für die Frage erwischte.

    Freitag, 12. November 2010 11:52
  • Hallo Josef,

    Gibt es eine Möglichkeit, dass man eine mit MS.net erstelle .net-COM-dll unter VB6 oder VBA verwendet, ohne die dll mit regasm registrieren zu müssen?

    Theoretisch sollte das System dies schon managen:

    COM activation, Registration Free COM activation, COM/.Net Interop, Registration Free COM/.Net Interop
    http://blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx

    Auf die Schnelle habe ich damit aber nicht erreichen können, was das Ziel des ganzen wäre. Wahrscheinlich hast Du den Artikel auch bereits gefunden. Am WE könnte ich mal genauer schauen, wo es hakt.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 17. November 2010 21:25
    Beantworter
  • Hallo Thorsten!

    Thorsten Dörfler [MVP] schrieb:

    Theoretisch sollte das System dies schon managen:
    COM activation, Registration Free COM activation, COM/.Net Interop, Registration Free COM/.Net Interop
    http://blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx

    Auf die Schnelle habe ich damit aber nicht erreichen können, was das Ziel des ganzen wäre. Wahrscheinlich hast Du den Artikel auch bereits gefunden.

    Diesen Artikel fand ich zwar nicht, aber ähnliche. ;-)
    Ich durchblicke allerdings nicht, wie ich das für VBA einsetzen könnte.

    Ich habe den Verdacht, dass das mit der manifest-Datei nur mit VB6-Anwendungen funktionieren wird - aber nicht in VBA.
    Wenn es mit VB6 funktioniert, könnte ich eventuell zur Not eine VB6-COM-dll erstellen, die nichts anderes macht, als die Schnittstellen einer MS.net-COM-dll weiterzureichen und als Brücke zw. VBA und MS.net dient. Das wäre allerdings nicht besonders praktisch. ;-)

    Anm.:
    Der Zugriff auf eine VB6-COM-dll aus VBA wäre kein Problem. Dafür nutze ich diesen Code.
    Das funktioniert aber nicht mit einer .net-COM-dll.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Mittwoch, 17. November 2010 22:20
  • Hallo Josef Pötzl,

    Schau Dir mal folgenden Artikel an. Vielleicht kann er Dir weiterhelfen --> Making a .NET Dll COM-Visible

    Du sagst am Anfang: “Ich würde gerne eine .net-COM-dll unter VBA ohne Registrierung nutzen.“ …und dann nachher „Ich nehme an, dass ich für die .net noch "Codebase" o. ä. angeben muss. Die Frage ist nur wo und wie? ;-)“ ...Codebase ist gerade eine Option der Registrierung (Set the code base in the registry) C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm AssemblyName [Options]…also einfach nach dem obigen Artikel nachmachen und Dich hier melden ob es funktioniert.

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 6. März 2012 18:44
    Moderator
  • Hallo Robert!

    Wie ich eine .net-dll COM-sichtbar mache, weiß ich, sonst könnte ich diese auch nicht mit VB6 (auch ohne Registrierung) verwenden. ;-)

    Bezüglich "Codebase": ich wollte damit ausdrücken, dass ich vermute, dass ActCtx ein Problem hat, weil die dll nicht im Verzeichnis der msaccess.exe oder excel.exe usw. steht (andererseits funktioniert es mit einer VB6-COM-dll).

    Ich diskutierte die Problemstellung auch im ms-office-forum.net.

    Hintergrund meines Vorhabens: ich würde gerne mit C# eine COM-dll erstellen, in der ich Routingeaufgaben für Access-Anwendungen kapsle.

    Allerdings kann/darf ich bei einigen Kunden keine COM-dll registrieren, da dort Admin-Rechte fehlen und ein Installation mit Admin-Rechten zu einem Anfrage-Marathon wird. Das Ändern der msaccess.exe-Manifestdatei kommt natürlich auch nicht in Frage.
    Aus diesem Grund nutze ich eine VB6-COM-dll per "DirectCOM". Da das aber mit einer .net-COM auch nicht funktioniert, wollte ich Regfree-COM mittels manifest-Datei ausprobieren. Das klappt derzeit aber auch wieder nur mit VB6-COM ohne Probleme.

    Aktuelle Problemumgehung: mit VB6 eine ActiveX-exe erstellen - diese einmal registrieren lassen - und über diese ActiveX-exe die Instanzen aus der .net-COM-dlls erzeugen. (Details siehe ms-office-forum.net ab Beitrag #8)
    Diese Vorgehensweise begeistert mich allerdings auch nicht besonders. Lieber wäre mir, wenn ich eine .net-COM direkt aus Access/VBA verwenden könnte.

    Beispiele/Tests:
    ComLibStarterTest.zip
    (Für die Durchführung der Tests ist AccUnit erforderlich - der Code ist aber so einfach, dass er auch ohne Testausführung zu verstehen sein wird. ;-))

    BTW: auch die Aussage, dass man eine .net-COM ohne Regstrierung in VBA (anders als bei einer VB6-COM) nicht verwenden kann, hilft weiter.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch






    Dienstag, 6. März 2012 19:18
  • Hallo Josef,

    Ein wirklich sehr interessantes Posting! - Danke, dass Du deine Gedanken mit uns hier teils. Eines verstehe ich aber immer noch nicht: Wie instanziierst Du denn die Klassen aus den .NET-COM-Bibliotheken in VB6 ohne dass diese vorher über regasm.exe registriert wurden?

    Für die VB6-ActiveX-Anwendung ist es ja unerheblich, was hinter den COM-Schnittstellen steht, aber da die Klassen im Hintergrund nun mal verwaltet sind, müssten sie erst von der mscoree.dll geladen werden. Und wenn das "auto-magisch", über Microsoft.Windows.ActCtx geschehen sollte, wie in aller Welt kann ActCtx die CLR laden? Und wenn die ActCtx zu sowas fähig ist, wozu sollte man dann die Registry noch sperren, ist doch eh egal vom Sicherheitsstandpunkt, oder?

    Der einzige mir bekannte Weg, .NET COM-Assemblies ohne Registrierung zu laden, geht über den Aufruf von spez. Methoden in der CLR. Das Szenario wird in Alan Gordon's "The .NET and COM Interoperability Handbook" beschrieben (Kap. 8: Advanced COM to .NET Interop):

    The CLR execution engine (MSCOREE.DLL) exports a function called ClrCreateManagedInstance that you can use to create a COM object that has not been registered using the Assembly Registration Tool (regasm.exe). When you call CoCreateInstance (or a similar COM activation method), the COM runtime takes the CLSID that you pass to it and uses it to look up the path to the executable or DLL that implements the CLSID beneath the HKEY_CLASSES_ROOT\CLSID\{CLSIDForComponent} key in the registry. When you use the Assembly Registration Tool to register an assembly, it inserts an entry beneath HKEY_CLASSES_ROOT\CSLID\{CLSIDForComponent} that points to the CLR execution engine (MSCOREE.DLL) and then puts a value beneath that key that identifies the managed class that the CLR execution engine should load after it starts. The ClrCreateManagedInstance function takes an assembly name and the name of a class within the assembly to load. ClrCreateManagedInstance then loads the execution engine and uses the CLR's standard assembly search algorithm to find the assembly and load the specified class.

    Wie man sehen kann, wird auch hier nur mit Wasser gekocht: Die CLR wird gestartet und lädt die .NET-Assembly, nur dass dafür die Registry nicht mehr durchsucht werden muss, sondern die notwendigen Infos über Argumente übergeben werden.

    Gruß
    Marcel

    Mittwoch, 7. März 2012 11:43
  • Hallo!

    In einer VB6-exe kann das per Manifest eingestellt werden (ist am praktischen) oder über die ActCtx-COM-Schiene per Late-Binding geladen werden.

    Der Test-Code ist in einem SVN-Repository, falls es dich interessiert: https://svn.access-codelib.net/svn/RegFreeCOM/!svn/bc/3/

    Test mit der VB6-exe und Manifest-Datei: https://svn.access-codelib.net/svn/RegFreeCOM/!svn/bc/3/trunk/Tests/TestVB6exeManifest/
    Test mit Vb6-exe und ActCtx-API: https://svn.access-codelib.net/svn/RegFreeCOM/!svn/bc/3/trunk/Tests/VB6exeActCtxAPI/

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    • Bearbeitet Josef Pötzl Freitag, 9. März 2012 08:49 fixe Subersion-Rev ergänzt, damit Dateien fixiert sind
    Mittwoch, 7. März 2012 12:25
  • Hallo Josef,

    Ich krieg's leider nicht zum laufen, alle Access-Tests schlagen fehl (ich muß mir anscheinend doch etwas mehr Zeit dafür nehmen).

    Eine Frage noch: Im TestVB6exeManifest-Projekt hast Du eine Referenz auf NetComClassLibrary.dll, die bei mir als MISSING angezeigt wird. Ohne eine gültige Referenz läßt sich das Projekt gar nicht erst kompilieren. Deshalb: Bist Du sicher, dass Du die NetComClassLibrary.dll nicht bereits vorher über regasm.exe registriert hast?

    Gruß
    Marcel

    Mittwoch, 7. März 2012 13:49
  • Hallo Josef Pötzl,

    Also ich habe folgendes gemacht:

    1)    Ein Excel aufgemacht und die folgenden Verweise unter VBA angegeben:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb (Common Language Runtime Execution Engine 2.4 Library)

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\ mscorlib.tlb

    2)    Die Datei NetComClassLibrary.dll in demselben Ordner wo die Excel Datei liegt, hinzugefügt

    3)    Folgenden VBA Code verwendet:

    Sub Command1_Click()
         Dim clr As CorRuntimeHost
         Dim domain As AppDomain
         Dim objTest As Object
         Dim fltResult As String
          
         Set clr = New CorRuntimeHost
          
         clr.Start
         clr.GetDefaultDomain domain
         Set objTest = domain.CreateInstanceFrom("C:\dell\NetComClassLibrary.dll", "NetComClassLibrary.Info").Unwrap
         fltResult = objTest.Version
         clr.Stop
         
         '//Debug.Print fltResult
         MsgBox fltResult
     End Sub

    4)    .NET-COM string wird angezeigt

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 7. März 2012 15:11
    Moderator
  • Hallo!

    Danke Robert, das war genau das was ich suchte.

    Gibt es eventuell noch eine Möglichkeit ohne Verweis auf mscoree & Co. auszukommen?

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Mittwoch, 7. März 2012 16:48
  • Hallo Josef,

    Ich möchte der Antwort von Robert nicht zuvorkommen, aber so viel ist sicher: Solange .NET verwalteten Code ausführt, *muss* irgendeine Anwendung die CLR laden damit die CLR ihrerseits die .NET COM Assembly laden kann. Im von Robert beschriebenen Szenario wird die CLR von Excel gehostet.

    Edit: Sorry. Deine Tests hatten bei mir nicht funktioniert, da die Manifestdateien aus dem SVN-Repository fälschlicherweise mit der Endung *.xml heruntergeladen wurden. Sxs fand deshalb natürlich keine Manifestdateien. Sobald Sxs die Manifestdateien während der Prozesserstellung findet (man kann diese auch über dieses Tool generieren), parst es das Anwendungs-Manifest und die aller abhängigen Assemblies. Sobald ein COM-Client dann eine Instanz mit einer CLSID erstellen will, die Sxs bekannt ist, lädt Sxs die .NET Runtime und ruft mscoree!DllGetClassObject(CLSID) auf und mscorwks.dll lädt über Assembly.Load die entspr. Assembly. Der ganze Prozess wird im Detail hier beschrieben.

    Gruß
    Marcel

    Mittwoch, 7. März 2012 16:56
  • Eine Frage noch: Im TestVB6exeManifest-Projekt hast Du eine Referenz auf NetComClassLibrary.dll, die bei mir als MISSING angezeigt wird. Ohne eine gültige Referenz läßt sich das Projekt gar nicht erst kompilieren. Deshalb: Bist Du sicher, dass Du die NetComClassLibrary.dll nicht bereits vorher über regasm.exe registriert hast?

    Zum Anfügen des Verweises in der Manifest-Variante registrierte ich schon die dll mit regasm. Anschließend entfernte ich diese Registrierung allerdings wieder. Funktioniert die Vb6Exe.exe bei dir nicht?

    Bezüglich Access-Tests: AccUnit hattest du aber schon installiert? ;-)

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Mittwoch, 7. März 2012 17:05
  • Mea culpa! AccUnit hatte ich natürlich installiert ;-). Hatte sogar über tlbexp.exe eine tlb-Datei erzeugt, um VB6 zufrieden zu stellen. Allein... beim Herunterladen vom SVN-Repository habe ich dann doch übersehen, dass die Manifestdateien als *.xml heruntergeladen wurden. Ohne die Endung .manifest waren die Dateien aber wertlos für Sxs. Deshalb die Fehler (hab's auch unten nochmals erklärt). Danke für diese Diskussion. So macht das Forum richtig Spaß!

    Gruß nach Graz
    Marcel
    Mittwoch, 7. März 2012 17:33
  • Hallo Marcel!

    Dass die CLR geladen werden muss ist klar. Aber vielleicht geht das auch noch über CreateObject o. ä.
    In diesem Fall kann ich aber mit Early Binding leben, da es vermutlich  keine Verweisproblem mit mscorlib.tlb und mscoree.tlb geben wird. So etwas wie die komplette Schnittstelle überarbeiten, wie bei ADODB (Win 7 SP1) passiert, wird es hoffentlich nicht geben. ;-)

    Bezüglich Manifest-Erzeugung: das klappt auch mit mt.exe ganz gut.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Mittwoch, 7. März 2012 17:42
  • Hallo Josef,

    Eine Lösung über CreateObject() und late binding gibt es tatsächlich.
    Ich habe sie zur Abwechslung mal mit Word 2003 VBA getestet :-)

    Sub Test()
      Dim Info As Object
      Set Info = CreateObject("NetComClassLibrary.Info")
      MsgBox Info.Version
    End Sub

    Damit das funktioniert, sind folgende Dateien zu erstellen: 

    1. %programfiles%\Microsoft Office\OFFICE11\WINWORD.EXE.manifest
    2. %programfiles%\Microsoft Office\OFFICE11\NetComClassLibrary.dll.manifest

    Außerdem muss das o.g. Verzeichnis natürlich die NetComClassLibrary.dll enthalten.

    WINWORD.EXE.manifest:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependency>
          <dependentAssembly>
             <assemblyIdentity name="NetComClassLibrary" version="1.0.0.0" processorArchitecture="x86" />
          </dependentAssembly>
       </dependency>
    </assembly>

    Noch die NetComClassLibrary.dll.manifest:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
       <assemblyIdentity 
          name="NetComClassLibrary" 
          version="1.0.0.0" 
          processorArchitecture="x86">
       </assemblyIdentity>
       <clrClass 
          clsid="{A09EB69A-7952-4187-9686-A5967FF6F2D8}" 
          progid="NetComClassLibrary.Info" 
          threadingModel="Both" 
          name="NetComClassLibrary.Info" 
          runtimeVersion="">
       </clrClass>
       <file name="NetComClassLibrary.dll" hashalg="SHA1">
       </file>
       <dependency>
          <dependentAssembly>
             <assemblyIdentity 
                name="mscorlib" 
                version="2.0.0.0" 
                publicKeyToken="b77a5c561934e089">
             </assemblyIdentity>
          </dependentAssembly>
       </dependency>
    </assembly>

    Ob das Schreiben in %programfiles% aber um so viel besser als das Schreiben in die Registrierung ist, ist fast eine philosophische Frage.


    Gruß
    Marcel


    Mittwoch, 7. März 2012 18:42
  • Hallo Marcel!

    Danke für deine Mühe, aber das Ändern der Manifest-Datei von msaccess.exe & Co schloss ich bereits in einem früheren Beitrag aus. ;-)
    Ich meinte übrigens nicht CreateObject auf NetComClassLibrary.Info sondern auf CorRuntimeHost.

    Wie bereits geschrieben: Mit dem VBA-Verweis auf mscoree.tlb u. mscorlib.tlb kann ich leben. Hauptsache ich muss meine .NET-COM-dll nicht registrieren. .. und das klappt mit dem Code von Robert tadellos.

    LG
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Donnerstag, 8. März 2012 10:30
  • Hallo Josef,

    Keine Ursache. War eine Sache von 10 Minuten. Nächstes Mal werde ich hoffentlich auch gleich erraten, was Du dir bei CreateObject so vorstellst.

    Gruß
    Marcel

    Donnerstag, 8. März 2012 11:07
  • Nächstes Mal werde ich hoffentlich auch gleich erraten, was Du dir bei CreateObject so vorstellst.

    Hallo!

    Ich war der Meinung das geht aus

    "Gibt es eventuell noch eine Möglichkeit ohne Verweis auf mscoree & Co. auszukommen?"

    und

    "Aber vielleicht geht das auch noch über CreateObject o. ä.
    In diesem Fall kann ich aber mit Early Binding leben, da es vermutlich  keine Verweisproblem mit mscorlib.tlb und mscoree.tlb geben wird. "

    hervor. ;-)

    Nächstes Mal schreibe ich aber einfach einen Beispiel-Code, damit das besser erkennbar wird.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 8. März 2012 13:01
  • Hallo!

    Noch ein Nachtrag, falls jemand eine ähnliche Lösung verwenden will.

    Wenn man in der .net-COM-dl Namespaces verwendet, muss man den kompletten Namespace für den Parameter typeName von NetAppDomain.CreateInstanceFrom angeben. Die Angabe von ProgId (COM-Kennung) reicht nicht aus, wenn der Namespace davon abweicht.

    Würde man die COM-dll allerdings registrieren und eine Instanz über New erzeugen, muss man die ProgId verwenden.

    Aktuell verwende ich folgenden Code: NetComDomain.cls

    Die Klasse wird z. B. in VBA folgenermaßen verwendet:

    Factory für NetComDomain einer Bibliothek:

    Public Property Get MeineLib() As NetComDomain
       If m_MeineLib Is Nothing Then
           Set m_MeineLib = New NetComDomain
           With m_MeineLib
                .LibraryFile = LibPath & "AccessCodeLib.Data.SqlTools.interop.dll"
                .DefaultNameSpace = "AccessCodeLib.Data.SqlTools.interop"
           End With
       End If
       Set MeineLib = m_MeineLib
    End Property

    Zum Erzeugen einer Instanz:

    Set Instanz = MeineLib.CreateObject("KlassenNameOhneNamespace")

    Anm.: Namespace wird innerhalb der NetComDomain.CreateObject gesetzt, damit man den Namespace im VBA-Code nicht immer schreiben muss.

    Beispiel-Anwendung (Access-Datei): SqlToolsTestClient

    mfg
    Josef

    /EDIT:

    [OT]

    Ich hob die Antwortmarkierung von Marcels Beitrag auf (konnte dort allerdings keinen Kommentar als Begründung einfügen, daher an dieser Stelle), da es keine Anwort für meine beschriebene Problemstellung ist. Ich schloss diesen Ansatz sogar in einen meiner vorhergehenden Beiträge aus. Die passende Lösung/Antwort für meine Problemstellung war der Beitrag von Robert.

    Da ich davon ausgehe, dass das Markieren eines Beitrags nicht als Punkte-Sammelaktion sondern als Hilfe für andere (die nach einer ähnlichen Lösung suchen) zu verstehen ist, bin ich der Meinung, dass man nur jene Beiträge als Antwort markieren soll, die zur Lösung beitrugen.
    (@Marcel: das ist nicht gegen dich gerichtet, sondern ist nur mein Verständnis vom Begriff "Antwort" auf eine "Frage".)


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 29. März 2012 11:42
  • Hallo Josef,

    Ich unterstütze deine Entscheidung, mein Posting von oben nicht als Antwort auf Deine Frage zu akzeptieren. Du hast eben Vorbedingungen gestellt, die ich übersehen hatte. Es handelt sich um Deine Frage, also hast Du ein Recht darauf.

    Allerdings muss auch gesagt werden, dass mein obiger Code 100% funktional ist. Vielleicht hilft er anderen Forumsteilnehmer einmal in einem anderen Kontext (z.B. VSTO)

    ;-)

    Gruß
    Marcel

    Donnerstag, 29. März 2012 12:10
  • Hallo Marcel!

    Natürlich kann dein Beitrag anderen helfen! So meinte ich das mit dem Aufheben als Antwort auch gar nicht.
    Gäbe es eine Rubrik "Alternative Antwort/Möglichkeit", hätte ich das bei deinem Beitrag markiert. Es war aber eben keine Antwort/Hinweis zur von mir (möglicherweise zu ungenau) beschriebenen Problemstellung. ;-)

    .. und als Forenuser wünsche ich mir, dass ich mich auf Antwortmarkierungen verlassen kann.
    Ich finde so schon genug "Nicht-Antworten" auf Problemstellungen, wenn ich eine Suchmaschine verwende. :-))

    Übrigens: Die Verwendung einer .NET-COM-Bibliotheken für VBA hat einen netten weiteren Vorteil gegenüber VB6/C++-COM-dlls: man kann sie unverändert auch für Office 64 bit verwenden. ... auf jeden Fall ist nun (nach meinen bisherigen Tests) für mich die Erstellung von VB6-COM gestorben. Mit C# (oder VB.NET) programmiert man viel angenehmer - vom mächtigen .NET-Framework mal ganz abgesehen. :-)

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    Donnerstag, 29. März 2012 12:27
  • Hallo Josef,

    Die Antwortmarkierung dient zur Kennzeichnung der Antwort auf die gestellte Frage. Der Sinn dahinter sind nicht die Punkte, sondern die Hervorhebung von Beiträgen, die zukünftig für Leser des Threads relevant sein könnten. Ich nehme an, dass dies der Grund war, warum Robert meinen Beitrag vorgeschlagen und später als Antwort markiert hat. Alternativ hat man hier die Möglichkeit, einen Beitrag als hilfreich zu markieren. Danke.

    > Mit C# (oder VB.NET) programmiert man viel angenehmer - vom mächten .NET-Framework mal ganz abgesehen.

    Da kann ich dir nur Recht geben!

    Gruß
    Marcel

    Donnerstag, 29. März 2012 13:16
  • Der Sinn dahinter sind nicht die Punkte, sondern die Hervorhebung von Beiträgen, die zukünftig für Leser des Threads relevant sein könnten. Ich nehme an, dass dies der Grund war, warum Robert meinen Beitrag vorgeschlagen und später als Antwort markiert hat. Alternativ hat man hier die Möglichkeit, einen Beitrag als hilfreich zu markieren. Danke.

    Hallo Josef,Marcel

    Genau. Ich habe Marcels Beitrag markiert weil auch wenn er eine funktionierende „Alternative Antwort/Möglichkeit“ beschreibt, durch Bewerten eines Beitrags als "Die Antwort", andere Teilnehmer die Lösung schneller finden können. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.

    Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Postings anderer Beantworter bewerten.
    Hier dazu die wichtigsten Anhaltspunkte aus den
    Forenregeln und FAQs.



    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort".
    [Quelle:
    Forenregeln]

    Wie bewerte ich einen Beitrag? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle:
    Häufig gestellte Fragen]

    Danke an Euch für das Verständnis, für den Super-Diskussionsfaden den wir hier hatten, der auch noch jetzt Echo machtJ (z.B. COM-DLL - Zur Laufzeit eine Fehlermeldung: ist nicht registriert) und Viele Grüße und Erfolg,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 29. März 2012 13:29
    Moderator

  • Hallo,

    ich habe die Methode mit der mscoree.tlb und der mscorlib.tlb ausprobiert. Dies hat auch funktioniert.

    Leider nur mit einer .dll, die ich mit .Net Framework 3.5 erstellt habe mit meiner nun zwangsweise in .Net Framework 4.0 erstellten dll funktioniert dies nicht mehr. Hier läd in meinem Fall Word vba wohl die falsche CLR!?

    Run-time error '-2146234341 (8013101b)'


    Über eine Idee/Hinweis würde ich mich sehr freuen.

    Vielen Dank!



    • Bearbeitet Nibbler21 Dienstag, 9. Oktober 2012 13:32
    Dienstag, 9. Oktober 2012 11:52
  • Hallo,

    ich habe die Methode mit der mscoree.tlb und der mscorlib.tlb ausprobiert. Dies hat auch funktioniert.

    Leider nur mit einer .dll, die ich mit .Net Framework 3.5 erstellt habe mit meiner nun zwangsweise in .Net Framework 4.0 erstellten dll funktioniert dies nicht mehr. Hier läd in meinem Fall Word vba wohl die falsche CLR!?

    Run-time error '-2146234341 (8013101b)'

    Über eine Idee/Hinweis würde ich mich sehr freuen.

    Vielen Dank!

    Hallo Nibbler21,

    Ich glaube es wird Licht in was Du geschrieben hast: C#-Klassenaufruf aus WIN32 heraus

    Grüße,

    Robert



    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 14. Januar 2013 16:39
    Moderator
  • Hallo !

    Ich habe dasselbe Problem wie Nibbler21.

    Ich muss/will Framework 4 unter MS Access nutzen. Mit Framework 3.5 würde es klappen.

    Habe aufgrund der Links von Robert keine Lösung gefunden.

    Hat jemand eine Idee / Hinweise wie ich die CLR von Framework 4 verwenden kann ?

    DANKE ! 

    • Als Antwort vorgeschlagen quicksilv86 Donnerstag, 4. Februar 2016 13:51
    Dienstag, 19. Januar 2016 15:21
  • Hello Bruno,

    Same problem..

    My solution is explained here :

    http://stackoverflow.com/questions/35174557/vba-c-sharp-dll-no-registration/35179476#35179476

    Hope it helps!

    Donnerstag, 4. Februar 2016 13:54
  • Hello !

    Thanks worked perfect !!!

    I used MS Access, ==> msaccess.exe.config

    <configuration>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
      </startup>
    </configuration>

    Gruss Bruno

      <

    startupuseLegacyV2RuntimeActivationPolicy="true">

        <

    supportedRuntimeversion="v4.0"/>

      </

    startup>

    </

    configuration>

    Mittwoch, 24. Februar 2016 14:41