2016-04-26 1 views
-1

プロジェクトでは、C#で作成されアクセスで使用されるカスタムライブラリを作成しようとしています。 ( - >アセンブリ情報、プロジェクトのプロパティで)、 Access 2013でDLLを使用する - DLLクラスの呼び出し/初期化をより簡単にする方法

  • は、COMのためのプロジェクトを登録

    • は、Visual Studio 2012でクラスライブラリを作成し、
    • が見える組立COMを作った:これを行うには、私は次のようでしたinterop、
    • 私のクラスにはusing System.Runtime.InteropServices;が含まれています。

    DLLの目的は、処理することです/これを行うには、複数のアドレス、添付ファイルなどでSMTP経由のメールを送って、私は次のように作成しました:

    [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); 
    
           } 
    
    
        } 
    } 
    

    私は私のアクセスの参照でDLLを含んでおり、これはすべて良かった。私は次のように私のクラスを呼び出すしようとするものの:

    Dim test As OPS2Mail.SendOPSMail 
    Set test = New OPS2Mail.SendOPSMail 
    
    test.SendMail "[email protected]", "Test", "<b>Test</b>", "[email protected]", AttachmentArray 
    

    私は(アクセス/ VBA)エラー438, the property or method is not supported for this object.

    を取得するので、研究した後、私は彼らが私はメインクラスを作成する必要が述べたポストを見つけました関数(SendOPSMail)でクラスを呼び出し、次にVBAで、メインクラスを最初に初期化して、他のクラスを呼び出します。だから私は、追加DLLのコードに:

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

    とVBA/Accessで、私はそれを変更:

    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 
    

    これは動作するようですが、なぜ、呼び出し元は、このような面倒すべきですか?もっとシンプルにする方法はありますか?私はそれcom-visible作り、クラスを作成し、ちょうど1簡単Dimsetとそれを呼び出すような(あるいはセットなし?)

    申し訳ありませんが、ポストは、愚かな質問の負荷が含まれていますが、私はこれにちょっと新たなんだと場合は特にDLLに。

  • +0

    もしクラスが静的だったら、あなたはちょうどそれを呼び出すことができたかもしれません – BugFinder

    +0

    自分で見つけました。インターフェイスを使用して行うことができます。可能であれば私の質問に答えます。 – Nicolas

    +0

    可能な複製[VBAのCOM公開メソッドにアクセスできない](http://stackoverflow.com/questions/10574973/unable-to-access-com-exposed-methods-in-vba) –

    答えて

    0

    ここでいくつかの読書をした後:http://jumbloid.blogspot.nl/2009/12/making-net-dll-com-visible.html私は簡単にpublic interfaceを使用してDLLクラスを呼び出すことができます。

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

    そして私は私のクラスにデフォルトコンストラクタを追加しました::

    だから私は追加するものであるpublic SendOPSMail() { }

    そして、私のクラスには、作成したインタフェースを継承する:私は簡単にできるようになりましたpublic class SendOPSMail : ISendMail

    VBAのメソッド/クラスを次のように呼び出します。

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

    可能な場合は回答を受け入れる(2日)。 – Nicolas

    関連する問題