問題タブ [intptr]
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.
vb.net - .NET 1.1 WSDL - IntPtr (WindowsIdentity.Token) を WebMethod (ASMX Web サービス) の入力パラメーターとして使用できない
ASMX Web サービスを使用する従来の winforms VB.NET 1.1 アプリケーションで奇妙な状況に陥っています。ユーザー トークンを WindowsIdentity オブジェクトからパラメーターとして WebMethod に送信しようとしています。'HACK: コメントを追加します。
トークンのタイプは IntPtr です。最初の問題は、生成される WSDL が「サポートされていないタイプ」のエラーで IntPtr をサポートしていないことです。
これは大きな WTF の質問であり、安全ではないように聞こえるので、簡単で役立つ代替案は歓迎しますが、ホスティング環境の複雑さを含め、このシステムを変更する方法には多くの制約があります. したがって、他の多くの頭痛の種を節約するために、データの一部を Web サービスに渡したいと思います。
問題1
WSDL 生成のエラー:
別のアプローチ (WTF ファクターを拡張する) - IntPtr の問題を回避するには、次を使用して IntPtr を System.IO.Stream に入れるだけです。
winforms アプリの終了時に、サービスの BF.Deserialize() に。しかし、これは新たな奇妙な問題につながります。
この方法で Web サービス メソッドの署名を定義します。
Stream の 'System.IO' 修飾が無視され、UserService クラスの一部として解釈されているかのように、クライアント側でコンパイル エラーとして新しい奇妙な問題が発生します...
問題 2
したがって、いずれかの質問への回答、または同様の代替アプローチは素晴らしいでしょう...
c# - IntPtrとは正確には何ですか?
IntelliSenseを使用し、他の人のコードを調べることで、このIntPtr
タイプに出くわしました。それを使用する必要があるたびに、私は単に置くnull
かIntPtr.Zero
、ほとんどの機能が機能することを発見しました。それは正確には何であり、いつ/なぜそれが使用されるのですか?
c# - IntPtr キャストと新規
私はちょうど例を見ていました、そしてその中に私はコードを見ました
私たちのコードを調べてみると、すでに同様のパターンを使用していることがわかりましたが、私たちのコードにはほとんど同じことがありました。
この2つのテイクに違いはありますか?2番目のものは、新しいメモリを割り当てないため、何らかの方法で「より良い」ものになりますか、それともキャストが同じコンストラクターを下に隠しているだけですか?
c# - C#でビットマップ画像をIntPtrに変換するには?
私が見た例からこれを作成しましたが、エラーは発生しませんでしたが、画像は灰色で表示されます。
これを行うより良い方法はありますか?
PS: csproj をチェックして、ビルドで安全でないコードを許可しました。
c# - SIZE_T* をマーシャリングする正しい方法は?
次の C++ 関数定義があり、マネージ コードから PInvoke を介して呼び出そうとしています。
私のマネージ宣言は次のようになりました。
一部の人は、私が最終的に行ったのと同じバグに気付くかもしれません。これは 64 ビット ポータブルではありません。SIZE_T は可変サイズ (32 ~ 64 ビット) で、それへのポインタです。管理されたサイズでは、ポインターは 64 ビットに正しく変換されますが、uint は変換されず、arg1 の上位ビットにゴミが残る可能性があります。ゴミ箱はしばしばゼロだったので、これは特に永続的なエラーでした:(
私がうまくいった唯一の解決策は、次のマネージド宣言です。
IntPtr はそのサイズを正しく変更できるため、これはもちろん機能します。私のコードでは、IntPtr を整数として扱うだけで動作しますが、醜いハックのように見えます。おそらくUnmanagedType.SysUIntを使用して、これを適切に指定する方法があるはずですが、他の有効な解決策を思い付くことができませんでした。
c# - IntPtr演算
私はこの方法で構造体の配列を割り当てようとしました:
AllocHGlobalで割り当てられた配列内の各要素に構造体を「バインド」する割り当てられたデータにアクセスしたい...このようなもの
しかし、便利な方法が見つかりません...なぜIntPtrに算術がないのですか?これを「安全な」方法で回避するにはどうすればよいですか?
PtrToStructure関数がデータを構造体変数にコピーすることを誰かが確認できますか?言い換えれば、構造体を変更すると、構造体配列データの変更が反映されるかどうか。
間違いなく、構造体を使用してIntPtrが指すデータを操作し、毎回データをコピーせずに、安全でないコードを回避したいと思います。
みんなありがとう!
c# - IntPtr を必要とするメソッドを呼び出すには、/unsafe と Marshal.AllocHGlobal のどちらを使用するのがよいでしょうか?
アプリケーションの期間中、いくつかのインスタンスが持続するクラスがあります。これらのオブジェクトはそれぞれ、既存の float[] バッファからデータを追加する dll メソッドを呼び出し、完全なデータセットを IntPtr (float 配列) を受け入れる DLL メソッドに毎秒数回渡す必要があります。アンマネージ コードとして実行する方がよいでしょうか:
または、安全でないタグを使用して修正した方がよいでしょうか?
コンパイラで「安全でない」タグを使用する必要がないという利点はありますか? マーシャルクラスは実際に「より安全」ですか? これらの方法のうち、一般的にパフォーマンスが優れているのはどれですか?
私が前者に傾いているのは_floats
、メモリ空間をクリーンアップするときに GC が (非常に大きくなる可能性がある) 心配する必要がないからです。それは合理的な懸念ですか?推奨事項は ArraySize のサイズに依存しますか?
c# - C# - Marshal.Copy() によるバッファの破損
IntPtr と、それが指すバイト数を指定する int を受け取りました。データには、null、EOL などの任意の文字を含めることができます。次のことを試みると、バッファが破損します。
「buffer」と「ptr」は異なるメモリ位置にある同じバッファ BLOB を指していると思いますが、そうではありません (同じデータを別のメモリ位置にコピーしているだけです)。ただし、「ptr」には DLL モジュールへの文字列参照が含まれているため、任意のメモリ位置を指しているように見えます。
何か案は?ありがとう!
c# - IntPtr 加算
したがって、私が知る限り、私が見つけた IntPtr 追加の管理された例はすべてWRONGです。
例: http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx
私の考えでは、32 ビット システムで IntPtr が int32.MaxValue に (またはその近くに) あり、int32 をオーバーフローするオフセットを追加した場合、それはまだ有効なメモリ アドレスではありません (uint32 で有効であるため、 IntPtr では負の数で表されます)?!
コードは次のようにする必要があると思います。
私はクレイジーですか?
誰もが実証済みの真の IntPtr 追加の例を持っていますか?
c# - .NET Interop IntPtr と ref
おそらく初心者の質問ですが、相互運用性はまだ私の長所の 1 つではありません。
オーバーロードの数を制限する以外に、次のように DllImports を宣言する必要がある理由があります。
そして、次のように使用します。
ターゲットを絞ったオーバーロードを作成するのではなく:
そしてそれを次のように使用します:
by ref オーバーロードは結局使いやすくなりますが、私が気付いていない欠点があるのだろうかと思っています。
編集:
これまでのところ、多くの素晴らしい情報があります。
@P Daddy: 構造体クラスを抽象 (または任意の) クラスに基づいている例はありますか? 署名を次のように変更しました。
In
、、Out
およびMarshalAs
SendMessage (私のテストでは EM_GETCHARFORMAT) がないと失敗します。上記の例はうまく機能しますが、次のように変更すると:
CHARFORMAT2 形式が無効であることを示す System.TypeLoadException が表示されます (ここでキャプチャしてみます)。
例外:
形式が無効なため、アセンブリ 'CC.Utilities、Version=1.0.9.1212、Culture=neutral、PublicKeyToken=111aac7a42f7965e' から型 'CC.Utilities.WindowsApi.CHARFORMAT2' を読み込めませんでした。
NativeStruct クラス:
属性のabstract
追加などを試しましたが、同じ例外が発生します。StructLayout
編集:
FAQ に従わず、議論できる質問をしましたが、肯定的な回答は得られませんでした。それ以外にも、このスレッドには多くの洞察に満ちた情報がありました。したがって、回答を投票するのは読者に任せます。最初の 1 票から 10 票以上の賛成票が答えになります。2 日 (12/17 PST) にこれを満たす回答がない場合は、スレッド内のおいしい知識をすべてまとめた独自の回答を追加します :-)
再度編集:
私は嘘をついて、P パパの答えを受け入れました。