実現したいこと
VB6からDLLを呼び出してメール送信を実行していました。
ですが、そのDLL内の動作仕様を変える必要が出てきました。
VB6はソースコードは残っているもののサードパーティモジュールが既に存在せず、開発環境を作成することができないため、VB6側は変更できません。
DLL入れ替えのみによって実現したく、前回質問のお助けにより、
C#.NETにてDLLを作成し、VB6側からの呼び出しまでは成功しました。
https://teratail.com/questions/n25uag7iu7y5t4
しかし、VB6から実行すると
エラーが発生しました: ファイルまたはアセンブリ 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
となります。
MailKitなど別DLLもVB6の実行フォルダに置いてはいるのですが、参照ができないようです。
追記
ログを埋め込んでみると、
var message = new MimeMessage();
のところで落ちているようです。
C#で作成したdllからは参照できていないようです。
VB6
VB6側の定義は、このようにして、smtpmail.dllを呼び出しています。
'メール送信関数定義 Private Declare Function SendMail Lib "smtpmail" _ (sServer As String, sTo As String, sFrom As String, _ sSubject As String, sBody As String, sFile As String) As String
C#
下記のように実装し、DllExport.bat を使う方法でsmtpmail.dllを作成しました。
「C++からC# DLL を直接利用する方法」
https://qiita.com/Midoliy/items/58d56e202f104ebf867a
using System; using System.IO; using System.Threading.Tasks; using MimeKit; using MimeKit.Text; using MailKit.Net.Smtp; using MailKit.Security; using System.Runtime.InteropServices; using System.Security.Cryptography.X509Certificates; using System.Net.Security; using System.Text; using System.Linq; using System.Text.RegularExpressions; namespace smtpmail { public class smtpmail { // VB6から呼び出す関数の宣言 [DllExport(CallingConvention.StdCall)] public static IntPtr SendMail( ref IntPtr szServer, ref IntPtr szTo, ref IntPtr szFrom, ref IntPtr szSubject, ref IntPtr szBody, ref IntPtr szFile) {
ファイル構成
同一フォルダ内
mailsys.exe(VB6アプリケーション) smtpmail.dll(C#で作成したレガシーDLL。メール送信を担う) BouncyCastle.Cryptography.dll(ビルドフォルダに出力されたdll。以下同様) MailKit.dll MimeKit.dll System.Buffers.dll System.Formats.Asn1.dll System.Memory.dll System.Numerics.Vectors.dll System.Runtime.CompilerServices.Unsafe.dll System.Threading.Tasks.Extensions.dll System.ValueTuple.dll
現在の状況
smtpmail.dll内でログを仕込みましたが、VB6からのパラメータは受け取ることが出来ています。
そのあとのメール送信処理で落ちている模様です。

0 コメント