Serviceを読んで理解し、同意したものとみなします。4万件2UnityC#にて重たい処理をDLLにやってもらおうと思い、ViusalStudioを用いてC++のDLLをこちらを参考に作成しました。今度はクラス経由で呼び出してみようと思いC++側のクラスの定義をMSDNのここを参考にクラスを作成したのですがC#側からどのように呼び出せばいいのかがわかりません。6:13まだ試してないです。クラスライブラリを試してみようかと思ってますが、そもそも私のやろうとしてる事が非推奨のようなので、c#側でマネージャーを持ってc++側のメソッド呼び出しを管理するような仕組みにしようと思ってます。票6技術的にはC#コードから直接C++クラスのメンバ関数を呼ぶことも可能です。幾つかの理由からお薦めできません。@時計屋さん回答にある解決策を採用したほうがよいと思います。convention)をもちますので、DllImport属性でCallingConvention.ThisCallを指定し、EntryPointには"マングリングされた関数名"を指定する必要があります。お薦めできない理由:DLL/C++側クラスのコンストラクタ/デストラクタを、C#側から直呼び出すことはできません。少なくともC++クラスオブジェクトのnew/delete操作を行うC++側にヘルパー関数が必要です。DLL/C++側でエクスポートされる"マングリングされた関数名"に、C#側では常に追従させる必要があるためメンテナンスコストが高くなります。個の銅バッジ1当該クラスに対するポインタを取得した上で、マングリングされたメソッドをThisCallで呼べば確かに意は通りますし、呼び出しに対する曖昧性も環境依存も無く呼び出しは完結できますね。その点、思慮に無かったので、非常に参考になり、又自分の不勉強を恥じる次第です。ご教授いただき本当に有り難うございました。14:45マングリング自体がわかってなかったので調査したところメソッドのオーバーロードやネームスペースの関係でシンボル名が変化するんですね。メンテナンスコストが高いという事ですね。C++側をクラスにするのはやめてC#でマネージャークラスを作成しC++側はメソッドだけにして制御しようと思います。Frameworkで利用することはできません。関数ベースのインターフェースを別途用意して、管理するC++/CLI等を利用してラッパーを作成する等が考えられると思います。|5一般的には時計屋さんの回答にあるように関数ベースでの呼び出しが使われます。難易度は上がりますが、他の方が紹介されていない方法としてCOMインターフェースがあります。まじめにレジストリ登録しなくても、C++にてCOMインターフェースに沿ったC++クラスを実装しそのポインターを返します。C#側ではCOMインターフェースに相当するC#インターフェースを定義し、Marshal.GetObjectForIUnknown()などでインスタンスを得ます。この方法であればyohjpさんの提案に近い状態ですが、マングル名を意識する必要はなくなります。個の銅バッジ1COMを使うことで、確かに相互運用可能ですね。レジストリに登録が必須だと思っていたのですが、当該メソッド経由でディスパッチも軽くできますし。何を作るかにもよりますけど、ATLあたりを使えば相応に楽できるかな?と回答を拝見して思いました。3:57まずCOM自身を勉強するところから始める必要がありそうです。COMインターフェースに沿ったC++クラスの実装方法を調査しないとなんともわかりません。後はUnityで実装して動作すれば使ってみたいなあと思います。マングリングした名前を意識しなくていいのは正直良いですね。5:58COMインタフェースにするなら、もう少しコードを短くできます。DllImportで戻り値の型にインタフェース型を指定すれば良いです。そのインタフェースの定義にInterfaceType属性やGuid属性を指定しておけば大丈夫です。Marshal.GetObjectForIUnknownが不要になります。はい自分で書くときは戻り値にインターフェース型を指定します。これはわかっている人がやる方法であり、説明し辛かったのであえてメソッドを紹介しました。(蛇足的な回答ですし、Unityでdllという時点で質問者さんの勘違いが予見されていましたし。|1Unityの事は全く知らないのでC++/CLIを使って良い環境かどうかはわかりませんが、C++/CLIを使った.NETとネイティブC++の連携なら以下の記事が参考になると思います。.NET)の記事もあります。利用~なお、.NETとネイティブC++間でオブジェクトをやり取りする場合は一部を除いて変換しないといけないので、やりたい事によってはオーバーヘッドが大きくなり効果的でないかもしれません。C++/CLIの参考書・記事は少なく、.NETとネイティブC++に精通していないと学習するのが難しと思います。個の銅バッジ確かにあまりヒットする記事を見つけられないのと、技術レベルが高くて苦戦しています。やりたい事は山ほどありまして、以降の事をすべてC++のスレッドで行うというものです。●リソースのダウンロード、●Tarの展開、●Zip解凍、●解凍したUnityリソースをロードしてファイル保存、●ファイルシステムの構築、等になります。UnityC#で行ったところヒープ領域が膨大になり、アプリに実装した時にメモリが不足する可能性があるためC++へ移行しようとしています。ページ教えていただきありがとうございます。|1C++のクラスをC#でDLLを経由して呼び出すことはできません。いう場合は、C++/CLIでラッピングする必要があります。b);};として定義した場合は、C++/CLIで以下のように書くことができます。}};コンストラクタで非マネージクラスのオブジェクトを生成し、ファイナライザでそのオブジェクトを削除、デストラクタではそのままファイナライザを呼び出します。あとはメソッドをC++のメンバー関数を呼べばいいですね。C#やVBからは以下のように使うことができます。"{"が抜けていたので修正しました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。