質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

854閲覧

C#で作成したDLLをVB6より呼び出せるようにしたい(追加質問)

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2023/09/22 08:17

編集2023/09/29 06:42

2023年9月29日 修正

業務内容漏洩リスクを指摘されたため、質問の内容を伏せさせていただきます。
協力していただいた方々、大変申し訳ありません。

動作はできたもののまだテストはしていない状況です。
テストが通り世に出回りましたら、ブログなど何らかの方法で公開させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2023/09/22 12:10 編集

正規の方法ではないので、何が起きるかわかりません。 このままだと工数がかかって MSDN サブスクリプションを購入して VB6 の開発環境を手に入れたほうが安かった!なんてことになりかねないと思いますよ。 とりあえず、普通のC#プロジェクトから MailKit を呼び出して動くかどうか確認してみては?
退会済みユーザー

退会済みユーザー

2023/09/23 05:06

VisualStudio6はあるのですが、このプログラムで使用しているサードパーティモジュールがもう手に入らなくて、開発環境の構築ができないのです。 >普通のC#プロジェクトから MailKit を呼び出して動くかどうか確認してみては? これは既に動作確認済みです。 それをDLL化してVB6から呼び出すのに手こずっているわけです。
KOZ6.0

2023/09/23 07:01 編集

>このプログラムで使用しているサードパーティモジュールがもう手に入らなくて、開発環境の構築ができないのです。 開発環境に制限がかかるタイプのやつですか。 VB.NET に移行して別のモジュールにも差し替えができないってとこですかね。 まぁそれは置いといて、コンソールアプリを作ってキックするくらいしか手がないんじゃないですかね・・・
KOZ6.0

2023/09/25 09:32

応答がありませんが、どうなったんでしょうか? 正規でない方法を紹介しちゃったので行く末が気になるところです。
退会済みユーザー

退会済みユーザー

2023/09/26 00:33

すみません、週末からトラブルで別対応に追われていまして、今日か明日辺りから再開する予定です。
KOZ6.0

2023/09/26 00:44

そうですか、お疲れ様です。 のんびり待つことにします。
KOZ6.0

2023/09/26 06:39 編集

同一プロセスで動く COM で MailKit が動くとは思えません。 アウトプロセスならワンチャンありそうですが、ちょっと面倒くさい手順があります。 https://seraphy.hatenablog.com/entry/2018/06/06/190923 「C#によるOut-Procサーバー(EXEサーバー)の作成について」に手順があります。(未確認)
gklipxhh

2023/09/26 07:02

私の知る限り「レガシーDLL」という言葉は存在しません。 質問内容に書かれている「レガシーDLL」とは何ですか?
KOZ6.0

2023/09/26 07:23

COM や .NET の DLL と区別するために「レガシーDLL」という言葉を使っています。 結構一般的だと思いますよ。
gklipxhh

2023/09/27 11:01 編集

回答になっていません。 どのようなDLLを「COM や .NET の DLL と区別するために「レガシーDLL」という言葉を使っている」のですか? KOZ6.0さんは"「COM参照可能なDLL」と「.NET系のDLL」を区別するために「COM参照可能なDLL」の事を「レガシーDLL」という言葉を使って表現している"と書きたかったのでしょうか? OLE, COM, .NET Framework, .NET Core, .NETなどの歴史的背景やWindowsに詳しくない人物が「レガシーDLL」という単語をみたときにすべての人が「COM参照可能なDLL」の事だとすぐに理解できますか? ある程度知識ある人物が今回の質問内容を全て読むと「regasm.exe を利用している」という部分から「COM参照可能なDLL」と推測できるという程度では無いでしょうか? 「.NET系のDLL」が「レガシーでは無いモダンなDLL」とするなら「Win32のDllMainだけが存在するDLL」も「レガシーDLL」と判断される恐れはありませんか? あいまいな表現を利用するぐらいなら最初から「COM参照可能なDLL」と表現すべきではないでしょうか。 また、Googleで「レガシーDLL」と検索しても情報が出ません。 情報が出なければ一般的では無いと考えるのが妥当ではないでしょうか。 KOZ6.0さんがが経験してきた現場では一般的かもしれません。 しかし、teratailのように誰でも閲覧できるような場所では一般的に利用される単語のみ利用すべきだと考えます。 あげあしを取るとか、攻撃したいのでは無いのです。 せっかく知見を共有してくださってるのですから誰にとっても伝わりやすい書き方や単語を利用すべきだと考えています。 同様の問題を抱えた別の人物がteratailのこの質問にたどり着いた時に「レガシーDLLってなんだろう。Googleで調べても出てこない。」となりませんか?
KOZ6.0

2023/09/27 11:01 編集

いまのところ、DLL って大きなくくりでいくと3種類しかないと思います。 (1) 旧来のDLL (COM=ActiveX.dll登場以前のdll) (2) COM(ActiveX.dll) (3) .NET 系のDLL (1) を他と区別するのに、「レガシー」と呼んでいます。 現場というよりは、掲示板でよく見かける表現です。 「レガシーな DLL」とか、「レガシー API」とかですね。 マネージ/アンマネージというくくりもありますが、ActiveX.dll もアンマネージですからちょっと違うし、他にいい表現がありません。 GKL さんは、いい呼称をご存じですか?
gklipxhh

2023/09/27 11:52

もう一度私の回答を全てお読み下さい。 >あいまいな表現を利用するぐらいなら最初から「COM参照可能なDLL」と表現すべきではないでしょうか。 >せっかく知見を共有してくださってるのですから誰にとっても伝わりやすい書き方や単語を利用すべきだと考えています。 また、「COM=ActiveX.dll」とはどういう意味ですか? 「COM=ActiveX.dll」というファイル名ですか? 「COM」と「ActiveX.dllというファイル」は同じという意味ですか? Windowsに「ActiveX.dll」というファイルは標準で存在しませんが何のファイルですか? それとも「COM」と「ActiveX」は同じであると表現したかったのでしょうか? COMとActiveXは関係があるとはいえ別物です。 なぜ「COM」と「ActiveX.dll」が等号記号で結ばれているのでしょうか? 「DLL」と「dll」で大文字と小文字の差は何ですか? 何を意図して書き分けたのですか? 「マネージ/アンマネージ」ではなく「マネージド/アンマネージド」と表現したかったのでしょうか? また、KOZ6.0さんが掲示板でよく見かけるかどうかは正直な所どうでもいいです。 現時点でGoogleなどの検索エンジンで検索した時にWikipediaやIT用語辞典やMSDNなどで「レガシーDLLの定義は~です」という情報が出ますか?出ませんよね。 定義がはっきりしていない単語を使うべきでは無いです。 >同様の問題を抱えた別の人物がteratailのこの質問にたどり着いた時に「レガシーDLLってなんだろう。Googleで調べても出てこない。」となりませんか? 本題とは異なる内容が続くのでこれ以上返信しません。 もう一度引用しますが以下の意図で私はあえて指摘しています。 >せっかく知見を共有してくださってるのですから誰にとっても伝わりやすい書き方や単語を利用すべきだと考えています。
KOZ6.0

2023/09/27 12:51

レガシーってのがダメなら何と呼ぶべきですか?ってのをお聞きしたかったんですが、答えをもらえませんでしたね。 ひとつ訂正しておくと、レガシーっていってるのは「COM参照可能なDLL」ではないです。 DLLExport.BAT で作られた、COMでも.NET でもない DLL です。
nururi

2023/09/28 00:46 編集

stackoverflowで見かけるのは、 普通のDLL:"unmanaged dll" "native dll" COM DLL:"com dll" "com library" .NET DLL:"managed dll" ".net dll" 辺りでしょうか。 "legacy dll"でも80件HITしたので、別に全く使われていない訳ではないようです。 修正を求めるのであれば、 「...のような呼称が一般的なので、そちらを使われた方がよいかもしれません」 というような言いまわしをされた方が心象がよろしいかと思われます。
guest

回答1

0

ベストアンサー

MailKit を直接使えないなら、別 exe にしてキックしたらどうでしょうか?


追記

引数についてはメールなので改行や区切り文字が含まれますが、適切に処理することで渡せます。
もちろん、標準出力をリダイレクトして結果を受け取ることもできます。

ファイル出力してファイル名を渡す手もありますね。受け取った側は読んだら削除します。

原則として引数を「"」でくくります。
引数の中に「"」がある場合は、2つに変換してください。
長さについては試しに 10,000 文字渡してみましたが大丈夫でした。
コマンドプロンプトには 8191 文字という制限がありますが、直接渡す分には問題なさそうです。
以下サンプルです。

csharp

1public static void Main(string[] args) { 2 if (args.Length > 0) { 3 Console.WriteLine("引数を列挙します!"); 4 for (int i = 0; i < args.Length; i++) { 5 Console.WriteLine($"{i}:{args[i]}"); 6 } 7 Console.WriteLine("列挙完了しました!"); 8 } else { 9 string value1 = "吾輩は猫である。\n名前はまだない(改行はOK?)"; 10 string value2 = @"「""」は大丈夫かな?"; 11 string[] arguments = { 12 "\"" + value1.Replace("\"", "\"\"") + "\"", 13 "\"" + value2.Replace("\"", "\"\"") + "\"", 14 }; 15 ProcessStartInfo info = new ProcessStartInfo(); 16 info.FileName = System.Reflection.Assembly.GetEntryAssembly().Location; 17 info.Arguments = string.Join(" ", arguments); 18 info.UseShellExecute = false; 19 info.RedirectStandardOutput = true; 20 using (var p = Process.Start(info)) { 21 var reader = p.StandardOutput; 22 Console.WriteLine(reader.ReadToEnd()); 23 p.WaitForExit(); 24 } 25 Console.ReadKey(); 26 } 27} 28 29結果: 30引数を列挙します! 310:吾輩は猫である。 32名前はまだない(改行はOK?331:「"」は大丈夫かな? 34列挙完了しました!

さらに追記

MailKit が起動できなかったのは、exe.config のこの部分

XML

1 <runtime> 2 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 3 <dependentAssembly> 4 <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 5 <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 6 </dependentAssembly> 7 </assemblyBinding> 8 </runtime>

が無かったためだっだようです。

普通の .NET Framwork アプリにおいても、exe.config が無い環境では同じエラーで異常終了してしまいました。

実は NetMail には、RFC に沿わないメールアドレスをチェックする機能があるんですが、チェックが入っているがために、RFCに沿わない日本の携帯のアドレスには送れないという不都合があります。
今回は社内アドレスなのでそこは心配ないかなと思っていましたが、ソースをダウンロードしてアセンブリの参照をやりなおしてビルドすればよかったのかなという気もしてます。

投稿2023/09/23 03:48

編集2023/09/27 14:10
KOZ6.0

総合スコア2628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/09/26 06:09

いつもありがとうございます。別EXEも検討しましたが、メール本文などもあるので、引数渡しで問題になるのではと思い、VB6橋渡し用DLLと送信処理DLLに分けてみました。 しかし、残念ながらまだエラーになります。 質問本文に「2023年9月26日時点 現在の状況」として追記しています。
KOZ6.0

2023/09/26 07:29

このコメント見る前に回答を編集してしまいました!
退会済みユーザー

退会済みユーザー

2023/09/26 09:26

ありがとうございます! またトラブル対応中のため、明日にでも試してみます。
退会済みユーザー

退会済みユーザー

2023/09/27 07:43

Mailkitで送信するプログラムをWindowsEXEにして試してみました。 しかし、new MimeMessageの箇所で ファイルまたはアセンブリ 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040) とエラーになります。 これはちょっと詰みました…。
KOZ6.0

2023/09/27 08:30 編集

.exe.config も立派な依存ファイルです。実行環境にコピーしてますか?
退会済みユーザー

退会済みユーザー

2023/09/27 09:16

失礼しました。デバッグモードでビルドしたので、.exe.configやpdb、xmlも一括で、実行環境に持ってきたら動作しました! 解決です!!! ありがとうございました!!
KOZ6.0

2023/09/27 14:13

お疲れさまでした。解決してなにより。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問