RSS2.0 hr
カテゴリ
 連絡事項 (11)
 開発全般 未分類 (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)
コンテンツ一覧
最新記事
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 公開
2014/03/08 00:00
ニコ窓 Ver3.013 公開
コンテンツ一覧
公開ツール
ニコ窓
ニコニコ生放送用
ブラウザ
ニコ窓
コンテンツ
■ 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 )
【コメント一覧】
【新規コメント投稿】
お名前(最大20文字):  さん
コメント本文 (最大300文字、URL投稿不可):
P. 1 List
お知らせ
サイト情報
2015/01/12 00:00
ニコ窓の開発&公開を終了しました。
閲覧者数
今日: 4 昨日: 11
合計: 834601 (PV)
開始: 2010/03/11
ツールは公開終了しました。
リンクは自由に張って頂いて構いません。
管理人: motta
  はてなブックマーク Yahoo!ブックマーク Googleブックマーク Twitterでつぶやく
  RSS2.0 RSS2.0
  My Yahoo!
  livedoor Reader
  Windows Live
 
ACR WEB