C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■102357 / 3階層)  C++にC#を加えてひとつのexeに出来ますか
□投稿者/ とっちゃん (786回)-(2023/09/06(Wed) 21:15:42)
No102354 (hojoR さん) に返信
> C++で作られた既存のexeがあるのですが、これにC#のコードを加え、ひとつのexeにすることは可能ですか?
>
> ・既存環境:VS 2010 MFC
>
> ・C#ではFormなどのユーザインタフェースを追加したい。
>
<<カットしてる部分は後述>>

すでに魔界の仮面弁士さんが書いていますが
C++/CLI形式にする場合、exe/dll のどちらの場合でも VCランタイムはDLLリンクになります。
これは、C++/CLIのプログラム形式の仕様によるものなので回避策はありません。

また、MFCのランタイムもこの仕様の影響を受けるため、DLLでリンクする必要があります。
そのため、純粋な意味で1exeという形にすることはできません。


> ・C#追加後の環境:上記のままでもよいしVS 2022も持ってます。
>
VC++ランタイムをC++/CLIで利用する場合暗黙的な条件として
該当するVSがデフォルトサポートする、.NET Framework のバージョンを要求します。

VS2010の場合、4.0になるので、現実問題どこでおかしな状態になるかわからないという
潜在的不具合を抱えることになります。
要求バージョンを設定してもリンカーが利用するライブラリバージョンなどの都合で
うまくいかないことがあるので、VS2022に移行することをお勧めします。


> ・C++からC#スレッドを関数のように呼び出すイメージです。
>  (マルチタスクはしません)
>
C#のコードは別スレッドで動くということですか?
出来ますが、正直あまりお勧めしません。

ManagedスレッドとUnmanagedスレッド間でメモリのやり取りが必要な場合は
プロセス間通信と同じ方法でメモリのやり取りを行う必要があります。
Managedメモリは世代管理する関係で、物理メモリ上の場所を移動することがあります。
めったなことでは発生しないので、通常これが原因でエラーになることはありませんが
特定の条件がそろえば、移動することがあるのでそれが原因でエラーになることがあります。
.NET の仕様だし、.NET内に閉じている限りこれが理由でエラーになることはないので
通常は気にする必要もないことですが。

なので、ManagedスレッドとUnmanagedスレッド間でメモリをやり取りする場合は
プロセス間通信と同じ手法をとるか、Unmanagedメモリを利用してデータ転送する
必要があります(実質プロセス間通信に類似)。

> ・ひとつのexeにしたい理由
>  メモリに常駐させているデータをC++とC#で共有したいためです。
>  共有データは、C++とC#どちらからも読み/書きし、サイズの変化(リストの要素増減)もあります。
>  
メモリに常駐させているデータというのがどういうものかわかりませんが
Unmanagedのメモリは、C#から直接的には見れないので、Managedメモリに一度転送してから
参照することになります。

で、その多くの場合がほぼほぼプロセス間通信と同じ手法を用いることになるので
別スレッドで動かす前提なら、別プロセスにすることをお勧めします。


参考程度の情報ですが、過去に勉強会で、Formや、WPFのウィンドウを貼るという
セッションをやったことがあるのでリンクを貼っておきます。


・MFC(Doc/View形式)で、CView部分にFormsを貼り付けたい場合。

.NET Lab 2018/11 月の勉強会でしゃべっています。
https://dotnetlab.connpass.com/event/102490/
リンク先にセッション資料へのリンクもあります(動画はありません)。



・MFC の CView に WPFの画面を貼り付けたい場合。

わんくま勉強会東京#115でしゃべっています。
資料
https://1drv.ms/p/s!AuVVWpjfPyA0hPJZ3Dg8R0vFq6zt2w
ビデオ(2:40:00あたりから)
リンク張ると怒られるので、youtubeで「1/19わんくま同盟 東京勉強会」で検索してください。

サンプルプロジェクト
https://github.com/Tocchann/MfcOnWpf



編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: C++にC#を加えてひとつのexeに出来ますか /radian →Re[4]: C++にC#を加えてひとつのexeに出来ますか /hojoR
 
上記関連ツリー

C++にC#を加えてひとつのexeに出来ますか / hojoR (23/09/06(Wed) 17:01) #102354
Re[1]: C++にC#を加えてひとつのexeに出来ますか / 魔界の仮面弁士 (23/09/06(Wed) 17:28) #102355
  └ Re[2]: C++にC#を加えてひとつのexeに出来ますか / radian (23/09/06(Wed) 18:58) #102356
    └ C++にC#を加えてひとつのexeに出来ますか / とっちゃん (23/09/06(Wed) 21:15) #102357 ←Now
      └ Re[4]: C++にC#を加えてひとつのexeに出来ますか / hojoR (23/09/07(Thu) 11:15) #102359
        ├ Re[5]: C++にC#を加えてひとつのexeに出来ますか / radian (23/09/07(Thu) 15:03) #102360
        └ Re[5]: C++にC#を加えてひとつのexeに出来ますか / とっちゃん (23/09/07(Thu) 15:46) #102361
          └ Re[6]: C++にC#を加えてひとつのexeに出来ますか / hojoR (23/09/08(Fri) 09:45) #102364 解決済み
            └ Re[7]: C++にC#を加えてひとつのexeに出来ますか / HattariB (23/09/08(Fri) 12:17) #102365 解決済み
              └ Re[8]: C++にC#を加えてひとつのexeに出来ますか / hojoR (23/09/08(Fri) 20:19) #102366
                └ Re[9]: C++にC#を加えてひとつのexeに出来ますか / hojoR (23/09/11(Mon) 16:01) #102368 解決済み
                  └ Re[10]: C++にC#を加えてひとつのexeに出来ますか / ななし (23/09/28(Thu) 11:44) #102436

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信