0

私は先週、レンガの壁に頭をぶつけてきました。そのレンガの壁:CPUID。

私が偶然見つけたものはすべて、CPUIDを実装するC ++でクラスライブラリを構築し、それをC#プロジェクトで使用すると言っています。

さまざまな理由で、C#プロジェクトでC ++クラスライブラリを正しく機能させることができませんでした。私はあきらめて、クライアントに要求を満たせないことを伝えようとしています。しかし、私はロープの終わりにいて、助けを求めたいと思っています。

外部アセンブリをビルドせずに__cpuid()またはasmをC#でコンパイルする方法ありますか?

4

2 に答える 2

0

C#コンパイラは純粋なMSILを生成し、CPUIDのMSIL命令がないため、非C#アセンブリが必要です。リンクした質問には、コードではなくデータとしてCPUIDが含まれています。これは非常に壊れやすく、データ実行可能ファイルをマークするために.NETの外部からWin32 APIを呼び出す必要があります。これは、「外部アセンブリなし」という要望と矛盾するようです。

ただし、C#コードを.netmoduleとしてコンパイルし、C ++ / CLIリンカーを使用して、CPUIDを使用するいくつかの関数をC#コンパイラの出力と組み合わせることができる場合があります。最終的には、C ++ / CLIツールチェーンによって生成された単一の混合モードアセンブリになりますが、そのほとんどはC#で記述されています。

このオプションの場合、C#コードに名前で関数を呼び出させようとするのではなく、CPUIDを呼び出すコードからFunc<uint>またはデリゲートを作成し、そのデリゲートをC#コードに渡すのがおそらく最も簡単な方法です(これにより、 Func<uint, uint>2つのプロジェクト)。

于 2012-03-03T04:46:52.857 に答える
0

実際...私はそれをやったことがなく、コードを移植可能にしたり、将来の.NETバージョンとの前方互換性を持たせたい場合はお勧めしません。でも:

http://www.atrevido.net/blog/2005/01/28/Inline+X86+ASM+In+C.aspx

これはクールなトリックのようです。新しいオペレーティング システムでは、データは実行不可としてマークされていることに注意してください (NX または DEP または MS がそれを呼び出すもの)。C# の配列はデータです。そのページの最後のコメントは、それを回避する方法を示しています。

于 2012-03-09T09:35:51.880 に答える