2016-04-26 10 views
-1

Für ein Projekt versuche ich eine benutzerdefinierte Bibliothek zu erstellen, die in C# erstellt und in Access verwendet wird. Dazu habe ich folgende:Verwendung von DLL in Access 2013 - wie Sie das Aufrufen/Initialisieren der DLL-Klasse einfacher machen

  • eine Klassenbibliothek erstellt in Visual Studio 2012,
  • die Baugruppe COM sichtbar gemacht (in Projekteigenschaften -> Montag Informationen),
  • das Projekt Schreibt für COM Interop,
  • Enthalten using System.Runtime.InteropServices; in meiner Klasse.

Der Zweck der DLL zu handhaben ist/senden Mails über SMTP mit mehreren Adressen, Anhänge etc. Um dies zu tun, habe ich die folgenden:

[Serializable(), ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)] 
public class SendOPSMail 
{ 

    public void SendMail(string ToAddress, string Subject, string Body, string FromAddress, ref string[] attachments, string CCAddress = "", string BCCAddress = "") 
    { 

       //Check if attachment is null or not else assign empty value 
       attachments = attachments ?? new string[0]; //after research it seems that I cant assign a NULL array in VBA/DLL and need to be passed by ref - so this can be deleted 


       using (var msg = new MailMessage()) 
       using (var client = new SmtpClient("spamfilter.mySpamFilter.com", 587)) 
       { 

        msg.IsBodyHtml = true; 
        msg.BodyEncoding = System.Text.Encoding.UTF8; 
        msg.SubjectEncoding = System.Text.Encoding.UTF8; 

        if (!string.IsNullOrEmpty(FromAddress)) 
        { 
         msg.From = new MailAddress(FromAddress); 
        } 

        string[] splitTO = ToAddress.Split(delimiterChars); 

        foreach (var TO in splitTO) 
        { 
         msg.To.Add(new MailAddress(TO)); 
        } 

        //handle attachments 
        foreach (string value in bijlagen) 
        { 
         msg.Attachments.Add(new Attachment(value)); 
        } 

        //set the remaining required fields 
        msg.Body = Body; 
        msg.Subject = Subject; 

        //Send mail 
        client.Send(msg); 

       } 


    } 
} 

enthalten ich die DLL in meinem Access-Referenzen und das ging alles gut. Obwohl, wenn ich versuche, meine Klasse wie folgt zu nennen:

Dim test As OPS2Mail.SendOPSMail 
Set test = New OPS2Mail.SendOPSMail 

test.SendMail "[email protected]", "Test", "<b>Test</b>", "[email protected]", AttachmentArray 

Ich erhalte die (Access/VBA) Fehler 438, the property or method is not supported for this object.

So nach Forschung, die ich einen Beitrag gefunden, wo sie erklärte ich eine Hauptklasse zu schaffen, haben in die DLL, die die Klasse mit der Funktion (SendOPSMail) aufruft und dann in VBA initialisiere ich die Main-Klasse zuerst, um die andere Klasse aufzurufen. Also in dem Code DLL ich hinzugefügt:

public class MainOPSMail 
    { 
     public SendOPSMail GetSendOPSMail() 
     { 
      return new SendOPSMail(); 
     } 
    } 

und in VBA/Zugang habe ich es zu:

Dim testMain As OPS2Mail.MainOPSMail 
Set testMain = New OPS2Mail.MainOPSMail 

Dim test as OPS2Mail.SendOPSMail 
set test = testMain.GetSendOPSMail 

test.SendMail "[email protected]", "Test", "<b>Test</b>", "[email protected]", AttachmentArray 

Dies scheint zu funktionieren, aber warum sollte der Angerufene sein ein solcher Aufwand? Gibt es einen Weg, es einfacher zu machen? Wie ich eine Klasse erstellen, es com-visible machen und es nur mit einer einfachen Dim und set nennen (ohne den Satz oder gerade?)

Sorry, wenn die Post viele dummen Fragen enthält, aber ich bin ein bisschen neu in diesem und vor allem zu DLLs.

+0

Ich denke Wenn die Klasse statisch wäre, hättest du sie vielleicht einfach – BugFinder

+0

nennen können. Finde es selbst heraus. Kann über eine Schnittstelle erfolgen. Wird meine Frage wenn möglich beantworten. – Nicolas

+0

Mögliches Duplikat von [Auf COM-Exposed-Methoden in VBA kann nicht zugegriffen werden] (http://stackoverflow.com/questions/10574973/unable-to-access-com-exposed-methods-in-vba) –

Antwort

0

Nach dem Lesen hier: http://jumbloid.blogspot.nl/2009/12/making-net-dll-com-visible.html Ich fand heraus, dass ich meine DLL-Klassen leicht mit einem public interface aufrufen kann.

Also, was ich hinzugefügt ist:

public interface ISendMail 
    { 
     void SendMail(string ToAddress, string Subject, string Body, string FromAddress, ref string[] attachments, string CCAddress = "", string BCCAddress = ""); 
    } 

Und Ich habe einen Standard-Konstruktor in meiner Klasse: public SendOPSMail() { }

Und meine Klasse erbt von der erstellten Schnittstelle: public class SendOPSMail : ISendMail

Jetzt kann ich leicht Rufen Sie die Methode/Klasse in VBA wie folgt auf:

Dim test As OPS2Mail.SendOPSMail 
Set test = New OPS2Mail.SendOPSMail 
+0

Akzeptiert die Antwort wenn möglich (2 Tage). – Nicolas

Verwandte Themen