問題タブ [unsafe]
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# から AuditQuerySystemPolicy() (advapi32.dll) を呼び出すと、「パラメーターが正しくありません」が返されます
シーケンスは次のようになります。
- ポリシー ハンドルを開きます
LsaOpenPolicy()
(表示されていません) 。 LsaQueryInformationPolicy()
カテゴリの数を取得するために呼び出します。- 各カテゴリについて:
- 列挙値を GUID に変換するために呼び出し
AuditLookupCategoryGuidFromCategoryId()
ます。 AuditEnumerateSubCategories()
すべてのサブカテゴリの GUID のリストを取得するために呼び出します。AuditQuerySystemPolicy()
サブカテゴリの監査ポリシーを取得するために呼び出します。
- 列挙値を GUID に変換するために呼び出し
これらはすべて機能し、最後のものを除いて、期待される適切な値を返します。呼び出すAuditQuerySystemPolicy()
と、「パラメーターが正しくありません」というエラーが表示されます。微妙なアンマーシャリングの問題があるに違いないと思います。私はおそらく正確に何がAuditEnumerateSubCategories()
返されるかを誤解していますが、困惑しています。
ご覧のとおり (コメント済み) リターン ポインターをポインターとして逆参照しようとしAuditEnumerateSubCategories()
ました。それをしてもしなくても同じ結果になります。
コード:
c# - リフレクションを介してメソッドが安全でないかどうかを判断する
unsafe
リフレクションを介して修飾子を持つメソッドを除外する方法を探しています。メソッド属性ではないようです。
方法はありますか?
編集:この情報はメタデータにないようです。少なくとも、IL には表示されません。ただし、リフレクターはunsafe
C# ビューで修飾子を表示します。それがどのように行われたかについてのアイデアはありますか?
EDIT 2:私のニーズのために、メソッドのパラメーターの1つがポインターである場合、または戻り値の型がポインターである場合、メソッドは安全ではないことを前提としたチェックになりました。
もちろん、これは安全でないブロックがメソッド内で実行される状況を処理しませんが、繰り返しになりますが、私が関心を持っているのはメソッド シグネチャだけです。
ありがとう!
c# - .NET: オブジェクトの格納場所またはアドレスを表示しますか?
オブジェクトの「アドレス」を取得する方法はありますか? これはデモンストレーション用です。これは一般的には悪い考えであり、コードとして機能する場合は理解していunsafe
ます。プロジェクトは、安全でないコードを許可するように調整されています。しかし、私の試みは失敗しました。私がこれまでに持っているコードはコンパイルされていません:
Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')
メモリアドレスを取得できない場合でも、メモリスロットまたはそのオブジェクトの場所を示す何かが考えられます。
背景: 私の意図は、値渡しと参照渡しの違いを示すデモを作成し、これらのオブジェクトの場所をダンプすることです。
2010 年 6 月 27 日追加:
私は最終的に、.NET プログラム自体からそれを行うという考えを放棄しました。良い解決策にはならないようです。たとえそれが機能したとしても、コードが乱雑になり、結果を簡単な方法で説明したり、デモ目的で使用したりすることはほとんどできません。以下の回答でアドバイスされている方法で、優れた(CLR対応を意味する)デバッガーを使用して実行したいと思います。
デバッグは、構成設定のオプションを有効にすることで VS 内で改善できますがEnable Unmanaged Debugging
、残念ながら、Visual Studio の無料エクスプレス エディション (現在自宅にある唯一のバージョン) では利用できません。手動で機能させる方法はありますか?Enable Unmanaged Debugging
少し苦労した後、WinDbg を提供するDebugging Tools for Windowsをインストールしました。何年も前にドライバー開発に使用した優れたツールです。今では巨大なパッケージの一部です。指示に従って、SOS.DLL の方法を成功させようとしましたが、成功しませんでした。このDLLも見つかりません。このソリューションでもEnable Unmanaged Debugging
、プロジェクトにフラグが必要なようです...
c# - C# での void* からオブジェクトへの変換
C# プロジェクトでは、構造体に参照を配置してオブジェクト パラメーターを渡す必要があります。つまり、ディスパッチャーに渡された構造があります
lpObject は、次のようなカスタム オブジェクトへのポインターを保持します。
そして、SOMESTRUCT 構造体がメソッドからメソッドへと渡され、最終的にコードに到達します。実行フローも奇妙な SOMSTRUCT システムも変更できないため、唯一の解決策は、オブジェクトを次のようなポインターにキャストすることだと推測しました。
ただし、lpObject フィールドから myObject メンバーを取得する方法がわかりません。このようなもの:
それを行う方法はありますか、それとも不可能ですか?ガベージ コレクターにオブジェクトを処理するように指示するにはどうすればよいですか? 新しいガベージ コレクション オブジェクトを作成し、フィールドごとにデータをコピーする必要がありますか?
ティア、
c# - C#の安全でないコード
C#での安全でないコードの制限は何ですか?たとえば、CまたはC ++を使用しているかのように、事実上任意のポインタキャストと算術演算を実行できますか?
c# - intをbyte*に設定する方法C#
バイト*の特定のインデックスでintをバイト*に変換するにはどうすればよいですか?
理想的には、次のようなものが欲しいです。
ビットの最初の部分をigm[4]に設定し、残りをigm[5]に設定します。
編集:私はこれを処理するための多くの可能な方法があるかもしれないことを理解しています、私は可能であれば最も効率的な方法を探しています。
c# - C# での bool* の有用性
bool*
意味のある方法で使用できますか。たとえば、どのように変換bool*
するか、バイトに保存しますかbyte
bool*
私の目標は、自分のプロジェクトで自分の記憶を管理することです。詳細は重要ではありません。やりたいことだけです。今、私は自分の変数を保存できるようにしたいのですが、たまたまブール値を保存する必要があります。unsafe
と を使用してbyte*
、このブール値を保存し、スペースを最大限に活用するにはどうすればよいですか? 理想的には、バイトに 4 ビットを格納します。
.net - .NET で安全でないコードを使用する場合、制限はありますか?
.NET に、安全でないコードを許可するオプションが表示されます。画像をビットマップにすばやくコピーできるように設定されているアプリは 1 つだけです。
そのボックスにチェックを入れたので、制限はありますか? mono は Linux で問題なく動作するようです。これまでのところ問題は見られません。
.net - 安全でないコードのCLRと配列へのポインタポイント?
CLRが安全でないコードとどのように相互作用するかGoogleでさまざまな結果を見つけましたが、理解できませんでした。ガベージコレクターが安全でないコードで動作していることも混乱していますか?はいの場合、どのように?
配列へのポインタを指すことができません、最初の要素このコードを試します
しかし、私はそのエラーを受け取りましたエラー:タイプ'int[]'を'int*'に暗黙的に変換できません
c# - C#からのC++関数の呼び出し-不均衡なスタック
次のシグネチャを持つアンマネージC++関数があります。
私はそれをC#から呼び出そうとしています:
..。
古いC++プロジェクトの仕様からわかる限り、paramの場合はnull、 retの場合は0の両方が関数への有効な入力です。電話をかけようとするとうまくいくようですが、終了すると次のエラーが発生します。
PInvokeStackImbalanceが検出されました
PInvoke関数'...::Invoke'の呼び出しでスタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。
私は考えられることはほとんど何でも試しましたが(安全ではないことが最後の手段でした)、不均衡なスタックを取得せずに関数を実行する方法を見つけることができません。他に試すことができるものはありますか?