問題タブ [unmanaged]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unmanaged - 混合C++.NETアプリでマネージドまたはアンマネージドを強調しますか?
私が使用しているアプリは、2003年頃にほぼ完全にVisual C ++で記述されたWinFormsアプリです。UI構築フレームワークのため、現場に到着する前に.NETが選択されましたが、コードの大部分は管理されていない土地で開発されました。 。その一部は絶対に必要でした。非常に大きなデータセットに対してリアルタイムの画像処理を行い、画像バッファへのポインタを必要とするIntel画像処理ライブラリを使用します。実際、パフォーマンスが1%未満の場合です。それは重要です。
アプリ自体は、UIコードをいくつかの静的ライブラリにリンクすることによって形成された大きな実行可能ファイルでした。各静的ライブラリは、データ取得や画像処理などの機能サブシステムに対応しています。参加してから、他のアプリで再利用するマネージラッパーを作成して、これらのサブシステムのいくつかをDLLに分割しましたが、メインアプリは静的にリンクされたライブラリで実質的に構成されています。
私の同僚と私は、さらなる開発が管理されていないことを強調すべきか、管理されていることを強調すべきかについて大きく異なります。私が言及した場合を除いて、アンマネージコードを指示するパフォーマンス要件はありません。私たちは.NETにしっかりと取り組んでいるので、クロスプラットフォームは問題ではありません。私は、別段の指示がない限り、管理を優先すべきだと考えています。
先月、私の同僚はサブシステムを管理する一連のクラスを開発しました。それらをrefクラスとして実装し、いくつかのイベントを.NETインターフェースに追加するのではなく、gcrootを使用して管理対象クライアントへのハンドルを保持し、管理対象外の土地にとどまることができるように、Observerの実装をいくつか作成しました。これは私には間違っているように思えます。なぜあなたが無料で手に入れることができる何かを書くのですか?しかし、私はあまりにも硬直しているのではないかと思います。
何かご意見は?
c# - C# アプリケーションでの C++ クラス DLL の使用
インターフェイスとして単一のクラス (COM ではなく...単純な C++ クラス) をエクスポートするだけのアンマネージ C++ DLL があります。このクラスを C# で使用したいのですが、単に C# にインポートすることはできないと言われました。
私の C# アプリケーションでこのクラスを使用する正しい方法は何ですか?
c++-cli - C++/CLI でアンマネージ ポインターを渡す
多数の C++ 静的ライブラリに依存する C++/CLI ラッパー DLL を作成しています。一部の関数呼び出しでは、アンマネージ ポインターが渡されることを想定しています。適切に渡すにはどうすればよいですか?
また、他の関数は、「this ポインター」が void* として渡されることを想定しています。「これ」を渡す正しい方法は何ですか?
これが私のクラス定義です...
問題のポインタが使用されている私の使用法は次のとおりです...
&mClient と "this" を使用すると、次のコンパイラ エラーが発生します... 1>.\VBLoadSimulatorDll.cpp(40): エラー C2664: 'CIsmaClient::Create': パラメーター 1 を 'cli::interior_ptr' から ' に変換できませんCIsmaClient **' 1> with 1> [ 1> Type=CIsmaClient * 1> ]
1>.\VBLoadSimulatorDll.cpp(40): エラー C2664: 'CIsmaClient::Create': パラメーター 5 を 'VBLoadSimulator::RTPClient ^const' から 'VOID *' に変換できません
c# - C# からアンマネージ C++ 関数を取得する
信頼できるANSI標準Cコードがいくつかあります。つまり、ソースを持っていても、別の言語に翻訳したり、呼び出し引数を変更したりすることはできません。これらのアクションは権限を無効にするためです。150以上の機能があります。
ファイル名を .C から .CPP に変更して、Visual Studio 2009 の C++ コンパイラを使用してコンパイルできるようにするなど、付随的な変更を加えることができます。コンパイラ指令などを追加することもできます。必要に応じて、ラッパー レイヤーを通過することもできます。
もう 1 つの制限は、 C# コードでunsafeキーワードを使用することを会社が望んでいないことです。
これらの関数を C# プログラムから取得する必要があります。
典型的な C/C++ 関数は次のようになります。
double SomeFunction(double a, double[3] vec, double[3][3] mat);
配列の内容が入力される場合と出力される場合があり、両方である場合はほとんどありません。
最初にアンマネージ DLL を作成してみました (Extern C とマークされた関数を使用)。単純な引数 (int、double) のみを持つ関数は正常に機能しましたが、配列をマーシャリングする方法を特定できませんでした。(実際、いくつかのサンプル コードを見つけましたが、150 回複製するのは非常に複雑で無理でした。)
次に、同じソリューション内で 2 つのプロジェクトを試しました。1 つは C++ で、もう 1 つは C# です。C++ プロジェクトで、アンマネージとしてマークされた元の関数を呼び出すマネージ関数を作成しました。これは非常にクリーンで単純であり、単純な引数も問題なく機能しました。しかし、配列の場合、C# と C++ の境界を越えて引数の型を一致させる方法を見つけることができませんでした
Argument '2': cannot convert from 'double[]' to 'double*'
(また、前述のように、unsafe を使用してポインターを取得することはできません)。
確かに、私がやろうとしていることは可能でなければなりません。
これらの機能を取得するための最良の方法は何ですか?
(上記の関数を使用したサンプル コードは非常に優れています。)
c# - アンマネージ C++ mfc アクティブ x dll からの C# ダイアログの起動
アンマネージ C++ DLL からインスタンス化する必要があるダイアログを C# で作成するように言われました。コード内の別の場所でこれを行うには、マネージド c++ クラスを C++ プロジェクトに追加し、マネージド c++ クラスから C# dll を呼び出すだけです。しかし、私がしなければならないところから、それは私にはうまくいかないことがわかりました。c++ dll は MFCActiveX プロジェクトだからだと思います。このプロジェクトの任意のファイルに clr を設定するとすぐに、正しく登録されなくなります。登録しようとすると、3 つのエラーが表示され、登録されたというメッセージが表示されます。ただし、使用しようとすると、0x80040111「ClassFactory は要求されたクラスを提供できません」というエラーが表示されます。ここで問題が何であるかを誰かが知っているなら、私はそれを大いに感謝します. 私はこれを達成できる必要があるか (推奨)、それが不可能であることを証明する必要があります。
ありがとう
c# - C# プログラム (プロセス) がアンロードされない
別のアセンブリのクラスを使用する C# プログラムがあり、このクラスはアンマネージ DLL を呼び出して何らかの処理を行います。ここにスニペットがあります:
私が抱えている問題は、「Func」を呼び出すと、メインの C# プログラムがアンロードされないことです。メイン フォーム内で Close() を呼び出すと、タスク マネージャーを見るとプロセスが残っています。「Func」への呼び出しを削除すると、プログラムは正常にアンロードされます。私はいくつかのテストを行いましたが、プログラムの Main 関数は確実に返されるので、ここで何が起こっているのかわかりません。
c# - 管理されていない .NET の割合はどれくらいですか?
Reflector を使用していると、多くの安全でないコードに遭遇することがよくあります。管理されていない/安全な.NETの割合を知っている人はいますか?
c++ - C++ unmanaged を使用して Power Point の実行中のバージョンを取得するにはどうすればよいですか?
Power Point (2003 および 2007) で管理されていない C++ を使用しています。
IDispatch で実行中のバージョンの Power Point (2003 または 2007) を入手するにはどうすればよいですか?
ありがとう、どんな助けでも素晴らしいでしょう。
c# - C# から C++/CLI から C DLL System.IO.FileNotFoundException
System.IO.FileNotFoundException: The specified module could not be found
C++/CLI アセンブリを呼び出す C# コードを実行すると、純粋な C DLL が呼び出されます。これは、純粋な C DLL 関数を呼び出すオブジェクトがインスタンス化されるとすぐに発生します。
BackingStore は純粋な C です。CPPDemoViewModel は、BackingStore への参照を持つ BackingStore を呼び出す C++/CLI です。
CPPDemoViewModel で定義されたオブジェクトを作成するだけの新しい C# 単体テスト プロジェクトを追加します。C# プロジェクトから CPPDemoViewModel への参照を追加しました。
C++/CLI テスト プロジェクトは、CPPDemoViewModel に ref を追加するだけで問題なく動作するため、言語間を行き来することになります。
.Net 3.5 SP1 で Visual Studio 2008 SP1 を使用しています。Vista x64 でビルドしていますが、プラットフォーム ターゲットが x86 に設定されていることを確認するように注意しています。
これは私が見逃している愚かで明白な何かのように感じますが、私的に解決しようとして時間を無駄にするのはもっと愚かなので、恥ずかしい思いをしてここにいます!
これは、C++/CLI で実装された ViewModel を使用して DLL に保持している膨大な量のレガシー C コードを移植するプロジェクトのテストです。
edit ディレクトリを確認したところ、BackingStore.dll がコピーされていないことが確認できました。
典型的なマルチプロジェクト ソリューションで作成された標準の一意のプロジェクト フォルダーがあります。
驚いたことに、上位レベルの Debug は、C および C++/CLI プロジェクトで使用される共通のフォルダーのようです。
WPFViewModelInCPP\Debug には、BackingStore.dll、CPPDemoViewModel.dll、CPPViewModelTest.dll、およびそれらに関連付けられた .ilk および .pdb ファイルが含まれています。
WPFViewModelInCPP\CPPViewModelTestInCS\bin\Debug には CPPDemoViewModel と CPPViewModelTestInCS の .dll と .pdb ファイルが含まれていますが、BackingStore は含まれていません。ただし、BackingStore をそのディレクトリに手動でコピーしても、エラーは修正されませんでした。
CPPDemoViewModel にはプロパティCopy Localセットがあり、参照された場合にその DLL をコピーする責任があると思います。C# プロジェクトからピュア C DLLへの参照を追加できません。「バッキング ストアへの参照を追加できませんでした」と表示されるだけです。
問題が 1 つだけなのか 2 つなのかわかりません。
古い形式のコピー ビルド ステップを使用して、BackingStore.dll を特定の C# プロジェクトのディレクトリにコピーできますが、新しい .net モデルではそれが必要ないことを願っていました。
DependencyWalker は、欠落しているファイルが GPSVC.dll であり、セキュリティ設定の問題を示していると示唆しています。これはニシンだと思います。
edit2 BackingStore.dll の手動コピーを実行可能ファイルに隣接させることで、GUI が正常に動作するようになりました。C# テスト プロジェクトには、テスト プロジェクトの実行環境が原因であると思われる問題がまだ残っていますが、今のところ、それがなくても問題ありません。