問題タブ [marshalling]

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 投票する
5 に答える
59958 参照

c# - バイト配列からのC#のC /C++データ構造の読み取り

データがC/C++構造体からのものであるbyte[]配列からC#構造体を埋める最良の方法は何でしょうか?C構造体は次のようになります(私のCは非常に錆びています):

そして、このようなものを埋めます:

byte []配列として渡された場合、にコピーOldStuffする最良の方法は何ですか?NewStuffOldStuff

私は現在次のようなことをしていますが、ちょっと不格好な感じがします。

これを達成するためのより良い方法はありますか?


このBinaryReaderクラスを使用すると、メモリを固定して使用するよりもパフォーマンスが向上しMarshal.PtrStructureますか?

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

.net - 構造体の配列をマーシャリングする方法 - (.Net/C# => C++)

免責事項: マーシャリングの概念がゼロに近い..

私は文字列 + 構造体 C の配列を含む構造体 B を持っています。これを巨大な相互運用キャズムを越えて COM - C++ コンシューマに送信する必要があります。
構造体定義を装飾するために必要な属性の正しいセットは何ですか?

編集:@Andrew基本的にこれは私の友人の問題です。彼はこれを .Net で動作させています。彼は、C++ 領域で使用できる .tlb/.tlh を作成するためにいくつかの自動魔法を実行します。問題は、配列のサイズを修正できないことです。

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

.net - ネストされた配列を .NET から COM に公開する

を返す .NET (C#) のメソッドがありますstring[][]。RegAsm または TlbExp (.NET 2.0 SDK から) を使用して、含まれているアセンブリの COM タイプ ライブラリを作成すると、次の警告が表示されます。

警告: ネストされた配列のマーシャリング サポートはありません。

この警告により、問題のメソッドは生成されたタイプ ライブラリにエクスポートされません。Variant を COM の戻り値の型として使用し、COM クライアント側で /etc をキャストする方法があると言われました。この特定のアセンブリでは、対象となるクライアント オーディエンスは VB6 です。しかし、これを .NET 側で実際に行うにはどうすればよいでしょうか。

: 戻り値の型が Variant である既存のレガシー DLL (エクスポートされたタイプ ライブラリを含む) がありますが、この DLL (および .tlb) は .NET 以前のレガシー ツールを使用して生成されるため、それらを使用できません。

アセンブリが代わりに VB.NET で記述されていれば、まったく役に立ちますか?

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

.net - C++/CLI で std::vector<>::iterator を .NET インターフェイスに変換する

次のメソッドを持つネイティブ C++ クラスをラップしています。

1) この同じ種類のインターフェイスを表す ".NET の方法" は何ですか? 配列を返す単一のメソッド<>? array<> ジェネリックには反復子があるので、BeginLocals() と EndLocals() を実装できますか?

2) Localは .NET ラッパーで値構造体として宣言する必要がありますか?

ラップされたクラスを .NET フレーバーで表現したいのですが、管理された世界に慣れていないので、この種の情報をグーグルで検索するのはイライラします...

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

com - COM相互運用機能を使用してオブジェクトのライフサイクルを処理する最も効率的な方法は何ですか?

COM自動化用に作成したクラスを使用するWindowsワークフローアプリケーションがあります。COMを使用してクラスからWordとExcelを開いています。

私は現在、COMヘルパーにIDisposableを実装しており、Marshal.ReleaseComObject()を使用しています。ただし、ワークフローが失敗した場合、Dispose()メソッドは呼び出されず、WordまたはExcelのハンドルは開いたままになり、アプリケーションがハングします。

この問題の解決策は非常に簡単ですが、単に解決するのではなく、何かを学び、COMを使用する正しい方法についての洞察を得たいと思います。COMハンドルを所有するクラスのライフサイクルを処理するための「最良の」または最も効率的で安全な方法を探しています。パターン、ベストプラクティス、またはサンプルコードが役立ちます。

0 投票する
10 に答える
30655 参照

marshalling - オブジェクトのマーシャリングとは

この概念はよく使われると聞いたことがありますが、それが何であるかはよくわかりません。

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

.net - C# P/Invoke での C++ "string" クラスのマーシャリング

次のように定義されたネイティブ DLL に関数があります。

これを Microsoft の P/Invoke Interop Assistant に入れようとしましたが、「文字列」クラス (MFC からだと思いますか?) でチョークします。

さまざまな異なる型 (C# String、char[]、byte[]) としてマーシャリングを試みましたが、毎回 NotSupportedException または Native Assembly Exception を取得します (マーシャリングを試みたかによって異なります)。

ネイティブ文字列クラスが使用されているネイティブ/マネージド相互運用機能を行ったことがある人はいますか? これをマーシャリングする方法はありますか?独自のマーシャラーを作成する必要がありますか?

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

.net - ランタイム呼び出し可能ラッパー (RCW) スコープ - プロセスまたはアプリケーション ドメイン?

アンマネージ COM オブジェクトを参照するときのランタイム呼び出し可能ラッパー (RCW) のスコープは何ですか? ドキュメントによると:

ランタイムは、そのオブジェクトに存在する参照の数に関係なく、COM オブジェクトごとに正確に 1 つの RCW を作成します。

「推測」しなければならない場合、この説明は「プロセスごとに1つ」を意味するはずですが、それは本当ですか? 追加のドキュメントは大歓迎です。

私のアプリケーションは独自のアプリケーション ドメイン (Outlook アドイン) で実行されます。カウントが 0 になるまでループで Marshal.ReleaseComObject(x) を使用するとどうなるかを知りたいです (推奨)。他のアドイン (同じ Outlook プロセス内の他のアプリケーション ドメインで実行されているもの) から参照を解放しますか?

編集:パーフェクト - 今、混乱はさらに大きくなっています。2 つの回答 (Lette と Ilya から) に基づいて、2 つの異なる回答があります。MSDNの公式ドキュメントにはプロセスごと (ver. 2.0 以降の場合) と書かれていますが、ver. 2.0 以降ではこの文がありません。ドキュメントの1.1

同時に、Mason Bendixen の記事では、それは appdomain ごとであると述べています。

彼の記事は古い (2007 年 4 月) ため、明確化を求めるメールを彼に送信しましたが、他の誰かが何かを追加する必要がある場合は、追加してください。

ありがとう

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

.net - C# で "char *" をマーシャリングする

DLL に次の C 関数があるとします。

この関数を C# に P/Invoke し、char * を適切にマーシャリングするにはどうすればよいでしょうか。.NET は LPCTSTR の実行方法を知っているようですが、この関数を呼び出すときに NotSupportedException を発生させないマーシャリングを理解できない場合。

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

c# - C++ 構造体配列を C# にマーシャリングする

私はC++で次の構造体を持っています:

そして、これらの構造体の 3 つの配列を取得するために p/invoking している関数:

C++ では、次のようにします。

それは問題なく動作しますが、C# では動作しないようです。次のような C# 構造体を作成しました。

そして、それらのうちの 3 つの配列 (およびそのすべてのサブ配列) を初期化し、これに渡すと:

成功して戻りますが、LPRData 配列のデータは変更されていません。

LPRData の 3 つのサイズの生のバイト配列を作成し、それを次のような関数プロトタイプに渡すことさえ試みました。

GetData (バイト [] データ);

しかし、その場合、最初の LPRData 構造から「データ」文字列を取得しますが、同じ LPRData からの「prob」配列を含め、その後は何も取得しません。

これを適切に処理する方法のアイデアはありますか?