DllImportプロパティの概要

3742 ワード

管理コードとは、依存しなければならないことを意味する.NETフレームワークは実行するコードを解釈し、非管理コードは一般的に従来の利用を必要としないことを指す.NETフレームワーク解釈のコード.はい.NETが登場する前に,VB,C+,DELPHIのように記述されたプログラムは非管理コードであった.
DllImportプロパティの機能:管理対象アプリケーションから非管理コードを呼び出す.
例えば、ビジネスダイヤルシステムでは、Cで記述するdllに直接メディアハードウェアと付き合うコードが統合され、開発時によく遭遇する.Netでこのdllのメソッドを参照する場合は、DllImportを使用する必要があります.
[DllImport("phonic_ubox.dll")]

// extern                
public static extern void ubox_close(); 

DllImportの列を見てみましょう

Cプログラムを使用してDLLを作成し、C#プログラムを使用してDLLを呼び出します.
int __declspec(dllexport) SampleMethod(int i)    
{    
  return i*10;    
}

C#プログラムから呼び出す
using System;    
using System.Runtime.InteropServices;    
public class MainClass     
{    
  [DllImport("Cmdll.dll")]    
  public static extern int SampleMethod(int x);    
    
  static void Main()     
  {    
      Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5));    
  }    
}

しゅつりょく
SampleMethod() returns 50.
 
DllImportプロパティ
まずDllImportコードの特性を理解し、相互運用を行う際には、DllImportでこの方法が非管理のコード方法であることを識別する必要があり、コンパイラがコンパイルする際にその特性にマークされている外来コードセグメントを正しく認識することができるので、コンパイルをスムーズに通過することができ、プログラムが実行されると、また、このコードが非管理コードを参照していることを正しく認識することができ、CLRに非管理DLLファイルをロードし、エントリポイントを検索して呼び出すことができます.
[DllImport("Win32DLL.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  public static extern int AddNumber(int x, int y);
このコードは非管理コードAddNumber法を明らかにし、DllImport特性のこれらの属性が具体的にどういう意味かを見てみましょう.DllImportコンストラクション関数にはdllnameのパラメータがあります
この構造関数のパラメータは、管理されていないdllの名前、すなわち、私たちが使用するインポート方法の具体的な位置であることを示す注釈を見ることができます.上の図のパラメータは「Win 32 DLL.dll」文字列で、つまり私たちの前の文章で作成した非管理C++生成ファイルで、後にいくつかの関連属性があり、私たちも一つ一つ説明します.
EntryPointプロパティは、管理されていないメソッドのエントリポイントが何であるかを決定するために使用されます.私の管理されていないコードのエントリポイント名はaddです.つまり、システムは、管理されていないコード名がEntrypointプロパティに依存していることを識別し、C#エディタで宣言した管理コードの名前AddNumberではなく、Entrypointだけで管理されていないエントリポイントを決定します.管理されていない呼び出し名を任意の名前で定義することができます.これは往々にして良い方法です.管理コードは常にオブジェクト化されたプログラミング方法にこだわっているので、命名の面でも重要です.オブジェクトの意味のない名前を勝手に作ることはできません.そうすれば、私たちは自分の、現在のコンテキストを複合することができます.イメージのある名前
DllImportプロパティのCharSetオプションプロパティ;
CharSet属性は、管理者と非管理者の呼び出しの過程でどのような文字符号化でデータを封入するかを決定するために使用される.NETプラットフォームはUnicode符号化を採用していますが、標準C++はAnsi符号化を採用しています.非管理コードの符号化方式を理解した後、どのように符号化するかを確定します.では、非管理コードがどの言語で書かれているのか、またはその符号化方式が分からない場合は、CharSet列挙のauto値を使用することができます.CLRに関連する詳細を自動的に処理させます.
DllImportプロパティのCallingConventionオプションプロパティ.
CallingConvention属性も比較的重要な属性であり、プラットフォーム呼び出しの過程でエントリポイントを検索する役割を果たし、管理コードが非管理コードエントリポイント検索を行う際、CallingConventionの値によって非管理エントリポイントの呼び出し約定を確認する.
extern "C"_declspec(dllexport) int _stdcall add(int x,int y) {  return x+y; }
この部分は非管理C++コードで、この方法の前に1つの_stdcallのキーワード、このキーワードはメソッドの呼び出し約束を意味します.stdcall呼び出しに関する概念の説明:関数のパラメータは右から左へスタックを通じて伝達され、呼び出された関数は戻る前に伝達パラメータのメモリスタックをクリーンアップする.呼び出しスタックをクリーンアップするために呼び出された側があるという意味です.
そして_declspec(dllexport)キーコードは、このメソッドを呼び出し可能メソッドにエクスポートすることを意味します.つまり、DLLファイルはメソッドごとに呼び出すことができないため、作成者が望む限り使用できます.
extern「C」キーコードは、名称修飾の意味であり、コンパイル中にCコンパイルオプションを用いてこの関数をコンパイルする.CとC++は異なる言語であり、具体的な文法も異なるため、C++の中で選択の余地を提供し、どのようなコンパイル方法でコンパイルするかを選択することができる.「C」コードで修飾した後、コンパイラは、異なる呼び出し規則を区別することによって、メソッドの名前を再命名します.
__stdcall呼び出し規則出力関数の名前に下線接頭辞を付け、後に「@」記号とそのパラメータのバイト数を付けて、フォーマットは_functionname@number例えば、function(int a,int b)は、修飾名:function@8 __cdecl呼び出し規則出力関数の名前に下線接頭辞を付けるだけで、フォーマットは_functionname. __fastcall呼び出し規則出力関数名に「@」記号を付け、後に「@」記号とそのパラメータのバイト数を@形式で表すfunctionname@number.
 
詳細:http://www.cnblogs.com/wangiqngpei557/archive/2011/06/23/2088107.html