問題タブ [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.

0 投票する
1 に答える
1389 参照

visual-studio-2008 - 混合モードのMFCアプリケーションがVS2008で正しく初期化されない

混合モードのMFCアプリケーションをVS2005からVS2008に変換しました。コンパイルはOKですが、アプリケーションを起動すると、afxCurrentResourceHandle = NULLであるため、afxwin1.inlでアサートが発生します。

これは、MyCWinApp::InitInstanceが呼び出される前です。コールスタックは

VS2005の同じプロジェクトが正常に起動し、WinMainCRTStarupと呼ばれるPostDllMainビーイングの代わりに呼び出され、定義されたインスタンスハンドルを取得していることに気付きました。

アプリは/clrを使用してコンパイルされ、マネージド、アンマネージド、および混合ライブラリとdllの両方にリンクします。

誰かがこの問題に光を当てることができますか?VS2005とVS2008の間で、この領域に既知の違いはありますか?

ありがとう!

0 投票する
5 に答える
8182 参照

.net - 混合モードの C++/CLR アプリケーションでのメモリ リーク

混合モードの C++/CLR .NET アプリケーションでメモリ リークが遅いという問題があります。

(「/clr」コンパイラ設定で VS2008 C++/CLR Windows フォーム アプリにリンクされた C++ ネイティブ スタティック ライブラリです)

典型的な動作: アプリは 30 MB (プライベート メモリ) を使用して起動します。次に、シミュレートされた高負荷の下で実行すると、1時間ごとにメモリリークが遅くなります。これにより、アプリが数日または数週間ライブになるようにシミュレートされます。

Visual Studio CRT ライブラリに付属する CRT デバッグ機能を含むいくつかのツールを使用して、メモリ リークを追跡しようとしました。また、市販のリーク検出ツール (「Memory Validator」) も使用しました。

両方とも、シャットダウン時のメモリ リークはごくわずかであると報告されています (数 KB に達する小さなエントリがいくつかありますが、私は気にしていません)。また、実行時に追跡されたメモリがそれほど大きくないように見えることがわかります(したがって、保持されていてアプリの終了時にのみ解放されるメモリだけではないと思います)。リストされたメモリは約 5 MB です (合計 > 30 MB のうち)。

ツール (Memory Validator) は、すべてのメモリ使用量 (malloc、new、仮想メモリ割り当て、およびその他の種類のメモリ割り当て全体を含む) を追跡するように設定されています。基本的に、追跡するメモリのすべての設定が選択されています。

.NET イメージは、(perfmon から) 約 1.5 MB のメモリを使用していると報告しています。

最後に、ネイティブ コンソール アプリケーションとして実行されるバージョンのアプリがあります (完全にネイティブ - CLR ではありません)。これは、UI 要素がないことを除いて、混合モードと 95% 同じです。これはまったくメモリ リークしていないようで、約 5MB のプライベート バイトでピークに達します。

つまり、基本的にここで理解しようとしているのは、どのネイティブ コードもメモリ リークしているとは思わないということです。

パズルのもう1つのピース:2.0フレームワーク(私がそうです)をターゲットにした場合の混合モードアプリケーションでのメモリリークに言及するこれを見つけました:http://support.microsoft.com/kb/961870

残念ながら、詳細は腹立たしいほどまばらなので、関連性があるかどうかはわかりません. 私は 2.0 ではなく 3.5 フレームワークをターゲットにしようとしましたが、それでも同じ問題がありました (これを正しく実行しなかった可能性があります)。

誰にも提案はありますか?

私を助けるかもしれないいくつかのこと:

  • 私が追跡していない他の種類のメモリ割り当てはありますか?
  • 数字が合わないのはどうして?5 MB の CRT メモリ使用量と 1.5 MB の .NET メモリが使用されるのに、アプリ全体で 30 MB のプライベート バイトを使用するのはなぜですか? それはすべて .NET フレームワークに縛られているのでしょうか? これらがリーク ツールに表示されないのはなぜですか? .NET フレームワークは、ある種の割り当てられたメモリとして表示されませんか?
  • 混合モードのアプリでうまく機能する他のリーク検出ツールはありますか?

助けてくれてありがとう

ジョン

0 投票する
1 に答える
3204 参照

static - gfortran および gcc と静的にリンクする混合言語

静的にリンクされた実行可能ファイルにコンパイルしたい C と Fortran で書かれたコードがあります。-fno-underscoring( gfortranのオプションを使用して) コードを動的にコンパイルすると、すべて正常に動作します。ただし、これを .so ファイルにリンクし、必要なライブラリのほとんどを静的にリンクしてから、このブログ投稿libkrb5で説明されている方法と非常によく似た方法で に動的にリンクしたいと考えています。

前回のブログ投稿の手順に従い、問題なく .so ライブラリをコンパイルできました。nmFortran サブルーチンと C 関数が表示されており、良好な状態であることを示しています。

最初の関数は Fortran で、2 番目の関数は C で記述されています。これらにはアンダースコアなどがないため、リンクする必要があります。私のメイン プログラム (Fortran) は、他の Fortran ソース ファイルと同じようにコンパイルされています。ただし、リンクしようとすると、エラーが発生します。

collect2: ld が 1 つの終了ステータスを返しました

ではmain_program.o

すべてが順調に見えるのに、リンクしていないのはなぜですか?

0 投票する
1 に答える
1018 参照

.net - ネットワーク共有からアプリを起動すると、混合モードの C++ DLL 関数呼び出しが失敗します。アンマネージ C アプリケーションから呼び出される

ネイティブ C アプリケーションから呼び出された混合モード DLL の読み込みに失敗しました: タイプ 'System.IO.FileLoadException' の未処理の例外が不明なモジュールで発生しました。

追加情報: ファイルまたはアセンブリ 'XXSharePoint, Version=0.0.0.0, Culture=neutral, PublicKeyToken=e0fbc95fd73fff47' またはその依存関係の 1 つを読み込めませんでした。最小限の権限リクエストを許可できませんでした。(HRESULT からの例外: 0x80131417)

私の環境は次のとおりです。混合モードの C++ DLL を呼び出し、C# DLL をロードするネイティブ C アプリケーション。ローカル ドライブからロードすると正しく動作しますが、ネットワーク ドライブから起動すると、上記のメッセージで失敗します。

LoadLibrary の呼び出しは成功し、GetProcAddress も成功します。関数を呼び出すとロードエラーが発生します。

C アプリケーションにデジタル署名し、2 つの DLL に対して "厳密な名前" 署名を実行しました。上記のメッセージの PublicKeyToken は、指定された DLL と一致します。また、クライアントで CASPOL コマンドを発行して、その厳密な名前のキートークンに FullTrust を付与しました。それがうまくいかなかったとき、ネットワーク ドライブの URL (アプリケーションのディレクトリへのパスを含む) に FullTrust を許可する CASPOL コマンドを試しました。結果に変化なし。

最初の混合モード DLL だけが存在するように、すべての依存関係を削除しようとしました... すべての関数の本体を、「成功した」整数値の戻り値に置き換えました。結果は変わりません。混合モードから Win32 に変更し、構成プロパティ >> 一般 >> 共通言語ランタイム サポートを「共通言語ランタイム サポート」から「共通言語ランタイム サポートなし」に変更した場合にのみ、DLL を呼び出すと期待どおりの結果が得られました (ちょうど「成功」整数の戻り値を返しました)。

0 投票する
2 に答える
2103 参照

visual-studio-2008 - クラッシュした混合モードの exe/dll から完全なスタック トレースを取得する方法は?

C++/CLR でアプリケーションを作成しました。ネイティブの lib/dll を使用します。まれに、このネイティブ dll 内でクラッシュすることがあります。次に、スタックトレースを取得しますが、マネージド部分までのみで、内部のネイティブ部分は省略されています。スタックトレース全体を表示させる方法はありますか?

次のテストを行いました。ネイティブ dll 内に、常にクラッシュするようにするコード行を追加しました。exeをダブルクリックして実行すると、先ほどと同様に管理部分のスタックトレースが取得されます。デバッガーを接続して (F5 キーを押すだけで) VS2008 から実行してクラッシュすると、スタック トレース全体、マネージド部分とアンマネージド部分が表示されます。

実際のバグはめったに発生しないため、ユーザーが VS を介してインストールして実行することなく、スタック トレース全体を何らかの形で表示する何かをアプリケーションに追加したいと考えています。それを行う方法はありますか?

Thx マーク

0 投票する
2 に答える
144917 参照

.net - .NET 4構成で「useLegacyV2RuntimeActivationPolicy」は何をしますか?

SlimDX を使用しているためアンマネージ コードを含むプロジェクトを .NET 4.0 に変換しているときに、次のエラーが発生しました。

混合モード アセンブリは、ランタイムのバージョン 'v2.0.50727' に対してビルドされており、追加の構成情報がないと 4.0 ランタイムに読み込むことができません。

グーグルで解決策を見つけました。これは、これをアプリケーション構成に追加することです。

私の質問は、何をしているのuseLegacyV2RuntimeActivationPolicyですか?それに関するドキュメントが見つかりません。

0 投票する
3 に答える
2748 参照

.net - .NET混合マルチファイルアセンブリ

2つのモジュールで構成される.NETアセンブリを作成する必要があります。1つはネイティブコードを含む内部(DLL内)、もう1つは外部(.netmoduleファイル内)です。

ネイティブ部分を除いて、これは簡単に実行できます。

C#のコンパイラはこれを行うことができます(これは私が望むものですが、ネイティブコードを使用します):

C ++コンパイラ/リンカは、すべてを1つの内部モジュールに入れます。

Assembly Linkerは、外部モジュールのみを実行します。

ILを手動で調整しようとしましたが、ILDASMとILASMはネイティブコードをラウンドトリップできないようです。


明確にするために、私が欲しいのはこれです:

0 投票する
2 に答える
1051 参照

visual-studio-2008 - どのC/C++オブジェクトが最も多くのメモリを使用しているかを判断する方法

メモリーフットプリントが高い混合モードアプリケーション(マネージドおよびネイティブ)があります。私はすでに、メモリのほとんどがネイティブコードによって割り当てられていることを知っています。私はメモリリークについて話しているのではなく、プログラムの開始後非常に早い段階で発生し、その後比較的安定している高いメモリ消費について話している。

どのC/C ++オブジェクトが最も多くのメモリを使用しているかを示すツールを知っていますか?DebugDiag 1.1とSoftwareVerifyのメモリバリデーターをすでに試しましたが、どちらのツールもC /C++オブジェクトを識別するのに十分な情報を提供していません。

よろしく

フランク

0 投票する
2 に答える
3461 参照

c# - C++/CLI 混合モード Dll を呼び出すネイティブ C Dll - 未処理の例外

レガシ アプリケーションによって動的に読み込まれるネイティブ C DLL があります。この dll の目的は、特定のアプリケーション イベントに基づいてアプリケーションの動作をオーバーライドできるようにすることです。これらのアプリケーション イベントを強化するために、混合モードの C++/CLI dll を介してネイティブ C dll から呼び出す関数を含む C# dll があります。このアーキテクチャを使用するアプリケーションは、Windows 2000 で問題なく動作します。

アプリケーションは Windows XP でも動作しますが、アプリケーションの起動時にネイティブ C dll が読み込まれると、残念ながらアプリケーションがクラッシュします (未処理の例外)。混合モードの dll をロードしようとするとクラッシュするようです。ネイティブ C dll から混合モード dll へのすべての依存関係を削除すると、アプリケーションは正常に起動します。しかし、依存関係が追加されると、クラッシュが発生します。Windows 2000 のコードは、Windows XP で使用されているものと同じです。アプリケーション コードにはアクセスできませんが、ネイティブ C dll コードにはアクセスできますが、初期化が完了する前にクラッシュが発生するため、デバッガーを停止できません。CLR の初期化と OS ローダーの違いに関係していると思われますが、確かではありません。これを解決する方法についての提案を探しています。2を使用してVS2005を使用しています。0 フレームワーク。ご協力いただければ幸いです。

例外とスタック トレースはあまり役に立ちません。

MyApplication.exe の 0x775125f6 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x775125f6。

...

0 投票する
2 に答える
4078 参照

c# - Win32プロセスから.NETDLLを呼び出す方法は?

Win32プロセスから.NETDLLを使用する場合のオプションは何ですか?基本的に、Win32プロセスのC#DLLを使用する必要があります。

現在、GACにC#DLLを追加して(RegAsm.exeを使用)、COMラップされた呼び出しを介してC#DLLを呼び出す必要がある解決策があります。ただし、その解決策はかなり重いです。このWin32プロセスを実行することになっているすべてのマシンのGACに.NETDLLを追加する必要があります。

RegAsmC#DLLを使用できるようになる前に呼び出す必要なしにこれを行うことは可能でしょうか?