プロジェクトでは、C#で作成されアクセスで使用されるカスタムライブラリを作成しようとしています。 ( - >アセンブリ情報、プロジェクトのプロパティで)、 Access 2013でDLLを使用する - DLLクラスの呼び出し/初期化をより簡単にする方法
- は、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簡単Dim
とset
とそれを呼び出すような(あるいはセットなし?)
申し訳ありませんが、ポストは、愚かな質問の負荷が含まれていますが、私はこれにちょっと新たなんだと場合は特にDLLに。
もしクラスが静的だったら、あなたはちょうどそれを呼び出すことができたかもしれません – BugFinder
自分で見つけました。インターフェイスを使用して行うことができます。可能であれば私の質問に答えます。 – Nicolas
可能な複製[VBAのCOM公開メソッドにアクセスできない](http://stackoverflow.com/questions/10574973/unable-to-access-com-exposed-methods-in-vba) –