2016-05-26 24 views
1

私は、.NETを使用してC#でWindowsアプリケーションをプログラミングし始めたばかりのC++プログラマーです。C#で定義を「インクルード」するにはどうすればよいですか?

私は、MSDNで、いくつかのサンプルコード(https://msdn.microsoft.com/en-us/library/chf6fbt4.aspx)を見ていると私は、次の(部分)コード参照:だから変数LOGON32_PROVIDER_DEFAULTLOGON32_LOGON_INTERACTIVEが明示的に例のコードで定義されている

const int LOGON32_PROVIDER_DEFAULT = 0; 
//This parameter causes LogonUser to create a primary token. 
const int LOGON32_LOGON_INTERACTIVE = 2; 

// Call LogonUser to obtain a handle to an access token. 
bool returnValue = LogonUser(userName, domainName, Console.ReadLine(), 
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle); 

を。

#define LOGON32_LOGON_INTERACTIVE  2 
#define LOGON32_LOGON_NETWORK   3 
#define LOGON32_LOGON_BATCH    4 
#define LOGON32_LOGON_SERVICE   5 
#define LOGON32_LOGON_UNLOCK   7 

C#でのものと同じタイプを行う方法があります:これとは対照的に、場合、私は、私はちょうど、すでにこれらの変数を定義しているWinbase.hが含まれている可能性がC++でこれを書いていましたか?だから、私はそれを自分でC#コードで定義することなくLOGON32_LOGON_INTERACTIVEを使用できるいくつかの魔法がありますか?私はヘッダーを再利用することで意味がありませんが、どのように一般的なC#で行われます。これらの値を手動で貼り付けなければならないと、かなりエラーが発生するようです。その上に、これらの定義で入力した人がやった苦労を完全には理解できませんでした!

+3

通常、Windowsライブラリとやり取りするとき、誰かがhttp://www.pinvoke.net(win32 /その他のアンマネージドAPIとのやりとりを文書化する目的で特にwiki)で既に作業を終えています。例:http://www.pinvoke.net/default.aspx/advapi32.logonuser(このページの「C#ユーザ定義型」を参照) – spender

+1

特定のC \ C++ヘッダファイルを再利用することは、 C#から、またはそれがどのように行われているかは、C#では一般的です。 – Evk

+0

私は後で言います。これは通常どのようにC#で行われますか? – Frank

答えて

3

同様に、C++は、コードではなく、関数の代わりにクラスを持つCコードよりもコードを分類しようとします(C言語の場合は、同じ長いプレフィックス)、C#はあなたのコードをさらに分類して、あなたのC++の同等物で説明したばかりの「グローバル項目」の練習を避けます。

したがって、C#で定数が必要ですか?いいです、クラスに入れて、必要な他のコードからClass.MY_CONSTANTを使用してください。

しかし、この特定のケースでは、同じ "ドメイン"を参照する定数がいくつかあるようですので、enumのメンバーのようなにおいが私にはあります。 C#のenumを学んでください。これらは非常に便利で、C++の同等のコードよりも多くのsuccintコードを持つことができます。

+1

私はCとC++にも列挙型があることに気付くと思います。 Windows SDKヘッダーはすべて* C *ヘッダーであり、古いものはヘッダーです。彼らが今日書かれていれば、間違いなくスコープ付き列挙型を使用するでしょう。これはC#のユニークな利点ではありません。実際、JavaのようにC#の制限ではなく、*すべて*がクラスです。 –

+0

あなたは間違っています。C#ではすべてがクラスではなく、プリミティブ型、構造体などがあります。 – knocte

+0

プリミティブ型は構造体として実装され、構造体は技術的な意味でクラスとは異なりますが、異なる。おそらく、私はそのコメントの最後の部分を別に持っているべきです。厳密にオブジェクト指向のプログラミング言語であるC#(およびJava)とは異なり、C++は多くのパラダイムの1つとしてOOPを提供する*マルチパラダイム*プログラミング言語です。 C#で自由な関数を実装することは不可能です。 –

2

私が知る限り、C#で直接C++ヘッダーを使用することはできません。

また、Enumを使用してこれらの値を格納することをお勧めします。

あなたはこれらのC#の機能を学ぶにいくつかの時間を入れて喜んでいる場合は、にできることはC++のヘッダからC#コードを生成するCodeDom/T4 Templatesを使用しています。 これは、値をコピーした人の面倒さ/エラーの可能性を減らすでしょう。

これらの種類の機能を提供するツールが既に用意されている可能性がありますが、あまりにも多くのアンマネージコードと対話する必要がないため、まだを検索しませんでした。

関連する問題