問題タブ [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.
c# - C ++ / CLIプログラムを.libにコンパイルし、それを純粋なアンマネージC ++プログラムとリンクするにはどうすればよいですか?
私はこれをフォローしていますhttp://www.codeproject.com/Articles/10020/Using-managed-code-in-an-unmanaged-application
この例は、次の3つのバイナリで構成されています。
- C#コード
- C ++/CLIコード
- C++コード
C++コードはC++/ CLIコードを呼び出し、次にC#コードを呼び出して、C ++からC#コードを実行する方法を実現します。
問題は、C ++ / CLIが.dllとしてコンパイルされているため、.libにコンパイルしようとすると、C++コードがC++/CLIコードとリンクされて失敗することです。
そのため、最終結果は2つのバイナリのみで構成されます。
- C#コード
- C ++ --LINK-- C ++/CLIコード
エラー
.net - 混合モードアセンブリのバージョン番号がWindowsエクスプローラーであることを表示するにはどうすればよいですか?
混合モードアセンブリのアセンブリ/ファイルバージョンをWindowsエクスプローラーに表示する方法はありますか?私はいくつかのバージョン管理の問題を調査しようとしていますが、アセンブリのバージョン番号を一瞥するだけではるかに速くなります。
c# - 外部コンポーネントがサードパーティアセンブリから例外をスローしました
プリンタデバイスとインターフェイスするサードパーティの混合モードアセンブリを使用します。
私たちのアプリケーションの1つでは、アセンブリは正しく機能します。
別のアプリケーションでは、次の例外が生成されていました。
調査を行った結果、この問題を解決するためにapp.configファイルに以下を追加できることがわかりました。
(動作するアプリケーションは、app.configにすでにこの設定があります)
これで「混合モードアセンブリ」の問題は解決しましたが、今では多少異なる問題が発生しています。
奇妙なことに、正しく動作するアプリケーションと動作しないアプリケーションがあります。どちらも同じコード(別のアセンブリ)を介してサードパーティのアセンブリを呼び出します。
同じコードパスを使用してサードパーティのアセンブリを呼び出す非常に単純なテストアプリを作成しようとしましたが、「外部コンポーネントが例外をスローしました」というエラーも発生します。
すべてのアプリケーションのapp.configファイルを比較しましたが、それらは基本的に同じであり、すべてのビルド設定がそれぞれで同じであることを再確認しました。どちらのプロジェクトも.NET4.0とX86を対象としています。
2つのアプリケーションには明らかに異なる点がありますが、それが何であるかを特定するのに迷っています。
開発環境はVisualStudio2010です。
誰かが私が調査できる他の分野について何か提案がありますか?
.net - 混合モードのC++/CLIアプリがCLRを正しくシャットダウンしない
混合モードのMFCアプリケーションは、MFC dllがシャットダウンされる前にCRTをシャットダウンする時間がないため、誤ったメモリリークを引き起こしています。
私は問題を示す非常にシンプルな小さなアプリを持っています:
でコンパイルしcl.exe /clr test.cpp
ます。実行すると、次のようになります。
問題の核心は次のとおりです。以前に宣言された静的/グローバル変数はgJamsUpTheCRT
割り当て解除されません。たとえば、私の場合、MFCCWinAppから派生したクラスはクリーンアップされません。
これは予想される動作ですか?アプリを完全にシャットダウンさせたいのですが。
ありがとう、
c++ - c ++/cliからネイティブc++コードの構造体へのポインターをインスタンス化するときにエラーが発生する
以下は私のc++/ cli"*.h"ファイルです
これらのネイティブc++構造体rmsReqInfoStruct、rmsClientInfoStruct、rmsPhysicianInfoStruct、rmsReqPolicyInfoStruct、rmsAddlOrderInfoStructへのポインターを宣言しました。これをコンパイルすると、以下のエラーが発生しますが、なぜこれらのエラーが発生するのかわかりません
これらのエラーはすべて、クラスのプライベート宣言自体の構造体ポインターに表示されており、それらが原因である理由を理解できません。誰でも助けてください。
c# - マネージド コードとアンマネージド コードの間で Graphics オブジェクトを共有すると、アンチ エイリアスが失われる
ネイティブ C++ と C# の間で Graphics オブジェクトを渡す
私は現在、ペイント .NET のようなアプリケーションに取り組んでいます。C# で実装されている複数の種類のレイヤーがあります。これらのレイヤーは、WinForms ユーザー コントロールによって提供される .NET Graphics オブジェクトに描画されます。これは、WPF キャンバス コントロールに似ています。レイヤーの基本クラスには、次のように実装される Draw メソッドがあります。
パフォーマンスと逆コンパイルの問題については、ベベルやドロップ シャドウなどの効果も適用しているため、混合モード アセンブリでレイヤーの構成を行っています。もちろん C++/CLI で記述されたラッパーは、キャンバス コントロールから直接呼び出され、各レイヤーのメタデータとターゲット グラフィックス オブジェクト (C# で記述されたキャンバス ユーザー コントロールのグラフィックス オブジェクト) をネイティブ C++ クラスに転送します。
C++/CLI ラッパー:
ネイティブ C++ レンダラー:
ここまでは順調ですね。上記のコードはほぼ期待どおりに動作しますが...
問題
唯一のことは、たとえばシャドウを使用して PNG をレンダリングするときに、現在の実装にアンチエイリアシングと半透明性が欠けていることです。したがって、アルファ チャネルには 2 つの値しかありません。255 の透過色または完全に表示される色です。この副作用により、アルファ チャネルとフォントを使用した PNG の描画が非常に見苦しくなります。純粋な C# コードで作業したときのように、以前と同じように滑らかで素敵な半透明のアンチ エイリアシングを取得することはできません。
BUT: ネイティブ Graphics オブジェクトで文字列を直接描画する場合、
アンチエイリアシングと半透明性が完全に復活しました。そのため、Graphics HDC を .NET に渡す場合にのみ問題が明らかになります。
質問
この問題の解決策/回避策はありますか? C# Layer クラスで Bitmap を直接作成し、HBITMAP の IntPtr をネイティブ コードに返そうとしました。このアプローチは機能していますが、この場合、HBITMAP を GDI+ ビットマップにアルファ チャネルで変換するための完璧なソリューションが見つからないため、別の問題があります (フォントを描画するときに白いピクセル ノイズがエッジを囲んでいます)。
ご意見ありがとうございます。:)
デモ ソリューション
添付のデモ ソリューションは次の場所にあります:ソース
このデモ ソリューションでは、3 つの異なるレンダリング方法 (すべて NativeRenderer.cpp に実装されています) をテストしていますが、最初の 1 つは説明されている問題を示しています。
1) RenderViaBitmapFromCSharp() - a) C++ で新しいビットマップを作成し、C++ で新しい Graphics オブジェクトを作成し、C++ Graphics オブジェクト HDC を渡して C# 描画コードを呼び出します -失敗
ただし: b) C++ からの直接描画は、作成されたビットマップ経由でも機能します。
2) RenderDirectlyFromCSharp() - C++ で C# グラフィック ハンドルから新しいグラフィック オブジェクトを作成し、C++ グラフィック オブジェクト HDC を渡すことによって C# 描画コードを呼び出します -動作します
3) RenderDirectlyFromCPP() - C++ で C# グラフィックス ハンドルから新しいグラフィックス オブジェクトを作成し、C++ でテキストを直接描画します -動作します
c# - 混合モード アプリケーション内から PageSettings にアクセスすると、プリンター DLL が何度もロード/アンロードされる
このコードをマネージド アプリケーションで実行すると、すべて問題ありません。ただし、混合モード (C# および C++) アプリケーションでは、Landscape
プロパティ (またはオブジェクトのその他のプロパティ) にアクセスするときsettings
に、プリンター ドライバー DLL が何度もロードおよびアンロードされるため、マネージ モードよりもコードが大幅に遅くなります。応用。出力には、次のような数十行が含まれます。
このような「無駄遣い」を防ぐためにできることはありますか?
c++-cli - dllからネイティブクラスをエクスポートする方法(つまり、protobufで生成されたクラス)
C#でいくつかのネイティブクラスを使用するために、C ++/CLIでラッパーdllを作成しようとしています。
テストのために、dllを使用する別のC ++/CLIプロジェクトを作成しました。
私の問題は、テストプロジェクトのdllプロジェクトでネイティブクラスの1つを使用したいのですが、リンカーがこのクラスメンバーのシンボルが見つからないと文句を言います。ネイティブクラスが定義されていないためだと思いref public
ます。ネイティブクラスコードはGoogleProtobuffersコンパイラによって自動生成されるため、追加できませんref public
。
誤解しないでください。将来のc#プロジェクトでこのネイティブクラスを使用したくありませんが、テストプロジェクトで直接アクセスしたいと思います。
.net-4.0 - InitInstance の前にクラッシュする C++/CLI MFC アプリをデバッグする方法
MFC(主に)とCOMを使用して構築されたこの巨大なC++アプリケーションがあります。いくつかのライブラリにリンクし、多くの科学計算を行います。そこで、新しい機能をいくつか追加したいと考えており、組織のポリシーとして、.NET を使用してすべての新しいものを開発しています。したがって、この新しい UI 機能は WPF を使用して構築され、この既存の C++ アプリケーションで使用されます。
私は C++ アプリケーションで WPF コントロールを使用する方法を知っているので、それは問題ではありません。問題は、このプロジェクトで CLR を有効にしようとすると、リンク段階でリンクを実行して混合モードの実行可能ファイルを生成するのに長い時間 (約 10 分) かかることです。最終的に、実行可能ファイルの作成に成功します。しかし問題は、この実行可能ファイルを起動するたびにクラッシュすることです。InitInstance をデバッグしようとしましたが、この前のどこかでクラッシュします。私は次に何をしようか少し困惑しています。
これの原因は何か考えている人はいますか?
混合モード アセンブリのターゲット フレームワークは 4.0 であるため (そうあるべきです)、これは問題ではありません。
参考までに、ILDasm はこの exe の読み込みにも失敗します。多くの時間がかかり、エラーは発生しませんが、ロードされません。これは、どういうわけか管理されたイメージが適切に作成されていないという印象を与えます。