問題タブ [mixed-mode]
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.
interop - .NETハンドルの値を確認してください^
これが私の状況です:
アンマネージC++オブジェクトへのポインターを保持する.NETラッパーオブジェクトがC++/CLIレイヤーにあります。ファイナライザーを実装して、ガベージコレクションのラッパーオブジェクトが指すアンマネージメモリを削除し、ポインターをnullに設定しました。
ここに問題があります:
.NETラッパーオブジェクトのファイナライザーを監視していますが、2回呼び出され、同じメモリを2回削除しようとします。これは、スコープ外になり、ガベージコレクションされる2つの.NETラッパーオブジェクトを作成したことを示しています。ラッパーオブジェクトがスコープ内にあることをまだ期待しています(これらのラッパーオブジェクトはVB.NETアプリケーションに渡されます)。
これが私の質問です:
とにかく、ラッパーオブジェクトが作成されている場所(コピーなど)を確認できるように、ハンドル値を確認することはできますか?現在、ハンドル値(EG-0x0014fe80)を調べていますが、オブジェクトが作成され、コレクションに追加され、削除されたときの3つの異なる値が表示されます。したがって、GCが何かを移動しているだけで、これが同じオブジェクトなのか、それとも同じアンマネージメモリを参照する3つの異なるオブジェクトが実際に表示されているのかはわかりません。可能であれば重複したオブジェクトのコピーを解決したいのですが、これが起こらないように、おそらく何らかのスマートポインターを実装したいと思うでしょう。
ありがとう、イアン
.net - 混合モードアプリケーションの同時GCの無効化
セットアップ:コードを挿入するアンマネージ/ネイティブのWin32アプリケーションがあります。私のコードは主に管理され、C ++ / CLIで記述され、DLLとしてコンパイルされています。私のローダー/インジェクターは、アプリケーションのcrt0スタートアップコードにパッチを適用します(基本的に、エントリポイント関数への呼び出しをLoadLibraryへの呼び出しと交換します)。ホストプロセスに接続すると、DLLはいくつかのコンポーネントDLLをメモリにロードし(挿入されたDLL自体はアンマネージコードで記述され、コンポーネントDLLのみがマネージアセンブリです)、コンポーネントDLLへのインターフェイスとして機能するようにさまざまなメモリ位置にパッチを適用します。
現在、コンポーネントDLLのコードがメモリリークを引き起こしているようです[ C ++ /CLIでの適切なオブジェクトの破棄で説明されています]。.NETメモリプロファイラーツールを使用してデバッグを検討しています。残念ながら、私の異常な環境はツールの完全な使用を妨げます。プロファイラーをプロセスにアタッチしようとすると、プロセスで同時GCが有効になっていることが報告され、内部APIを使用して参照などを追跡できなくなります。
そのモードのGCを無効にする構成ファイルを作成しようとしましたが、効果がないようです-プロファイラーは引き続きエラーメッセージを表示します(これは、ホストアプリが主にネイティブであるため、生成されないためだと思います)起動時に構成ファイルを解析します)。また、machine.configファイルを変更しようとしましたが無駄でした。
同時ガベージコレクターを強制的に無効にする他の方法はありますか?
c++ - C++ からのアセンブリ言語へのアクセス
これは私のプログラミング課題です。8086 プログラミング言語で記述されたメソッドを使用して、整数の配列の中で最大のものを見つける必要があります。これは私の試みです:
予想される答えは
1 2 3 4 5 6 6.しかし、私が得るのはこれです:
ここで私は座って考えます... 実際にメモリに格納されている配列のインデックス i の値ではないでしょうか? 少なくとも、a[i] が 12 (たとえば) の場合、i 番目のメモリ位置には 12 という数字が書き込まれていると教えられたからです。
または、値がメモリ位置に保存されていない場合、目的のタスクを達成するためにメモリ位置に書き込むにはどうすればよいですか?
また、これらの概念をブラッシュアップするために、ネット/ペーパーバックの資料をリンクしてください。
編集 :
アセンブリ内の同じコードは問題なく動作します...
dll - 混合モードの C++/CLI DLL が終了時に例外をスローする
作成した C++/CLI 混合モード DLL に問題があります。それを使用する.NETアプリケーションが終了すると、アンロード時に例外がスローされます。の実行後DLL_PROCESS_DETACH
、DLL は自動的に登録された関数を使用してランタイム クリーンアップをatexit() / __onexit()
行い、次の例外をスローします。
atexit()
静的ブースト例外オブジェクトによって登録された呼び出しに問題を追跡しましたget_static_exception_object()
。
ローダーロックを回避するために動的にリンクされているboost::threadを除いて、ほとんどの部分で静的にリンクされたboost_1_47を使用しています。また、ブーストのすべてを動的にリンクしようとしましたが、役に立ちませんでした。#pragma unmanaged
また、すべてのブースト インクルードはブロックで囲まれています。
誰かが同様の問題を抱えているか、解決策を知っていることを願っていますか?
ありがとう、マーク
例外が発生する直前のコール スタックを次に示します。
php - PHP および HTML コードを PHP 変数にロードし、
これが私の場合です。次のスクリプトがあります。
$_GET['request'] の値に応じて、変数 $right_column に php ファイルの内容を割り当てています。次に、最後の div でその変数をエコーします。firstPage.php ファイルと secondPage.php ファイルには、html と php のコードが混在しています。Zend の「部分」のようなソリューションを探します。ありがとう
.net - 管理されたアセンブリと管理されていないアセンブリのロード順序の混合
混合 .NET アセンブリ (つまり、マネージド/アンマネージド C++ アセンブリが混在していることを意味します) の CLR および CRT の初期化の順序についていくつか質問があります。
したがって、混合モードのアセンブリ dll ファイルがあり、Assembly.Load を介して読み込まれるとします。マネージド コードが最初に呼び出されるまで、静的ネイティブ オブジェクトは初期化または呼び出されないことに気付きました。わかった。したがって、起動時に CLR コードが最初に初期化され、CRT の初期化が最後に呼び出されると考えています。シャットダウンの順番は?CRT のシャットダウンが最初で、CLR のシャットダウンが最後ですか?
では、こんな流れでしょうか。
それとも別の順番ですか?
私の質問は、実行可能ファイル (.exe) である混合モード アセンブリにも当てはまります。似てる?
c# - クラス ライブラリから混合モード dll をロードする
したがって、C# クラス ライブラリからロードしたい混合モードの dll があります。しかし、このエラーが発生しています:
混合モード アセンブリは、ランタイムのバージョン 'v2.0.50727' に対してビルドされており、追加の構成情報がないと 4.0 ランタイムに読み込むことができません。
だから私はいくつかの検索を行い、これを私の app.config に追加する必要があることを理解しました:
しかし、今問題があります。クラス ライブラリから混合モードの dll をロードしようとしているので、app.config ファイルがありません。
どうすればこの問題を解決できますか?
.net - .NET セットアップ プロジェクトの「混合モード アセンブリ」
Microsoft.SqlServer.Smo アセンブリを使用する VS2010 で ac# アプリを構築しています。
注: addReferance->.NET ダイアログでこのアセンブリを検索したとき、何らかの理由で見つからなかったので、ProgramFiles(x86)->Microsoft SQL Server->90->SDK-> で参照する必要がありました。アセンブリ。
このアセンブリにより、実行時に「混合モード アセンブリ」例外が発生するため、Web で修正を検索したところ、App.Config ファイルを次のように追加する必要があることがわかりました。
<startup useLegacyV2RuntimeActivationPolicy="true">
<requiredRuntime version="v4.0.20506"/>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
これで問題は解決しましたが、新たな問題が発生しました。アプリのセットアップ プロジェクトを作成しましたが、セットアップを実行すると、同じ「混合モード アセンブリ」の問題が発生します。問題は、設定ファイルをセットアップ プロジェクトに追加できないことです。私に何ができる??
c++ - 混合モード DLL での presentationcore.dll へのリンク
ネイティブ C++ DLL をラップし、マネージド クラスを公開する C++ で記述された混合モード DLL があります。公開されたマネージド クラスでは、PresentationCore.DLL の一部である Vector3D などのメソッド引数を使用します。
したがって、混合モードの C++ コードは、PresentationCore.DLL を参照する必要があります。これは次の方法で行います
これには、プロジェクトの検索パスに、PresentationCore.dll が存在するフォルダーを含める必要があります。
これらのフォルダーはマシンによって異なり、プロジェクトは複数のマシンで変更せずにコンパイルする必要があるため、これは悪いことです。現時点では、PresentationCore.dll のコピーをコード リポジトリに含めることでこれを解決しましたが、これは明らかに適切な解決策ではありません。
GAC 経由で完全にアクセスできるようにする必要がある DLL への明示的なパスを指定する方法を提案していただければ幸いです。