RSS2.0 hr
カテゴリ
 連絡事項 (12)
 開発全般 未分類 (2)
 WEB開発 未分類 (1)
 C# (1)
 Java (2)
 PHP (1)
 Flash (1)
 WPF, Silverlight (6)
 Android (2)
 MySQL (1)
 ニコ窓 (66)
 Nico Rec Ctrlr (4)
 Live Seeker (8)
 Live Seeker Lite (4)
 Nico2ls (1)
 未完成ツール (7)
 TinyMCE (4)
 FFmpeg (6)
 Linux (1)
 PCパーツ関連 (1)
 掲載誌 (3)
コンテンツ一覧
最新コメント
返信がおそくなってしまい...
mottaさん 03/26 13:38
こんにちは。開発終了は残...
名無しさん 03/08 17:47
お役に立ててよかったです...
mottaさん 12/05 20:46
参考になりましたm(,_...
名無しさん 12/04 10:21
コメントありがとうござい...
mottaさん 10/21 22:42
公開ツール
ニコ窓
ニコニコ生放送用
ブラウザ
ニコ窓
コンテンツ
■ C#からネイティブコードの呼び出し(DllImport属性) - 2010/03/10 22:00:00

C#からネイティブコード(C言語、C++等)の関数を呼ぶ場合、
C#側で"System.Runtime.InteropServices.DllImport"属性を指定して、その関数と同様のメソッドを宣言します。
DllImport属性を指定して宣言すると、ネイティブコードの関数を、通常のメソッドのように、C#から呼び出せるようになります。

今回は、C#のコンソールアプリから、WIN32APIのGetComputerName()を呼んでみます。
GetComputerName()は、ローカルコンピュータのNetBIOS名を取得するAPIで、Kernel32.dllにあります。

開発環境と主な手順は、以下のようになります。

▽ 開発環境

OS: WindowsXP Professional
C#コンパイラ: Visual C# 2005 Express Edition

▽ 主な手順

① VC#で新規プロジェクト(コンソール アプリケーション)を作成する。
② DllImport属性を指定して、GetComputerName()を宣言する。
③ ②のGetComputerName()を呼び、コンピュータ名を取得し、表示する。

◆ 開発

① VC#で新規プロジェクト(コンソール アプリケーション)を作成する。

今回は、プロジェクト名を"DllImportTest"にしています。

② DllImport属性を指定して、GetComputerName()を宣言する。

DllImport属性は、下記、ソース(Program.cs)の青字部分のように指定します。
メソッドの宣言は、WIN32APIと.NET(C#)で、変数の型名が異なるので、以下のように一致させる必要があります。

◇ WIN32API

BOOL GetComputerName(LPTSTR lpBuffer, LPDWORD lpnSize);

◇ .NET(C#)

public static extern bool GetComputerName(StringBuilder buffer, ref uint size);
または
static extern unsafe bool GetComputerName(byte* lpBuffer, long* nSize);

WIN32APIと.NET(C#)での型の違いは、PINVOKE.NET で調べられます。

PINVOKE.NET: http://pinvoke.net/

[ Program.cs ]

using System;
using System.Collections.Generic;
using System.Text;

namespace DllImportTest
{
    class Program
    {
        // DllImport属性をしてメソッドを宣言
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        public static extern bool GetComputerName(StringBuilder buffer, ref uint size);

        static void Main(string[] args)
        {
            StringBuilder buffer = new StringBuilder(256);
            uint size = 256;

            // API呼び出し
            if (GetComputerName(buffer, ref size))
            {
                // コンピュータ名を表示
                System.Console.WriteLine("Computer name: {0}", buffer.ToString());
            }
            else
            {
                System.Console.WriteLine("GetComputerName() - error");
            }
        }
    }
}

③ ②のGetComputerName()を呼び、コンピュータ名を取得し、表示する。

②で宣言したGetComputerName()を、赤字部分のように呼び、コンピュータ名を取得します。
最後に、WriteLine()メソッドで、コンピュータ名を表示して終了です。

DllImport属性を使ってメソッドを宣言すれば、WIN32APIでも通常のメソッドとして呼べるようになります。

- 以上 -

編集履歴
[2007/05/19] 新規作成。
[2007/07/14] 誤植修正。
[2008/08/29] レイアウトを修正。
[2009/01/--] サイト移転。レイアウト変更。
[2010/03/10] サイト移転。レイアウト変更。
[2010/07/04] URL変更。

カテゴリ: C#  ブックマーク: はてなブックマーク Yahoo!ブックマーク Googleブックマーク Twitterでつぶやく  コメント( 0 )
P. 1 List
移転連絡
[2025/06/19]
新サイト[MOT NOTE
へ移転しました。
最新記事
2025/06/19 00:00
新サイト[MOT NOTE]へ移転
2021/11/24 00:00
東芝 dynabook KIRA V832/28HS のSSD換装
2015/01/12 12:00
ニコ窓の開発&公開終了
2014/05/04 00:00
ニコ窓 Ver3.015 公開
2014/04/27 00:00
ニコ窓 Ver3.014 公開
コンテンツ一覧
サイト情報
2025/06/19 00:00
新サイト[MOT NOTE]へ移転しました。
閲覧者数
今日: 15 昨日: 33
合計: 848367 (PV)
開始: 2010/03/11
ツールは公開終了しました。
リンクは自由に貼って頂いて構いません。
管理人: motta
  はてなブックマーク Yahoo!ブックマーク Googleブックマーク Twitterでつぶやく
  RSS2.0 RSS2.0
  My Yahoo!
  livedoor Reader
  Windows Live
ACR WEB