2012-02-28 13 views
3

標準ライブラリにアクセスすると、.NETフレームワーク自体がアンマネージDLLに依存していますか?たとえば、私はメソッドAを呼び出し、そのフードの下でメソッドAまたはそのメソッドA内の他のメソッドはアンマネージドDLLに対してPInvokeを実行しますか?標準.NETライブラリは、アンマネージDLLに依存しますか?

答えて

3

はい、.Netライブラリはアンマネージ機能を多く使用します。ライブラリが呼び出すことができるアンマネージ関数(私が知っている)には、Framework自体のメソッドと、PInvokeを使用する他のDLLのメソッドの2種類があります。

フレームワークに実装されているメソッドには、[MethodImpl(MethodImplOptions.InternalCall)]とマークされています。他のアンマネージDLLからのものには[DllImport]とマークされています。

私のバージョンのmscorlib.dllだけでは、フレームワークによって内部的に実装された7241メソッド(ゲッターのstring.Lengthなど)とアンマネージドDLLからの535(多くは内部クラスWin32Nativeです) 。

3

もちろん、フレームワークには、基礎となるWindows APIへの無数の呼び出しが含まれています。 File.Moveの逆コンパイルコードを見て:あなたが見ることができるように

[SecuritySafeCritical] 
public static void Move(string sourceFileName, string destFileName) 
{ 
    if (sourceFileName == null) 
    { 
     throw new ArgumentNullException("sourceFileName", Environment.GetResourceString("ArgumentNull_FileName")); 
    } 
    if (destFileName == null) 
    { 
     throw new ArgumentNullException("destFileName", Environment.GetResourceString("ArgumentNull_FileName")); 
    } 
    if (sourceFileName.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyFileName"), "sourceFileName"); 
    } 
    if (destFileName.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyFileName"), "destFileName"); 
    } 
    string fullPathInternal = Path.GetFullPathInternal(sourceFileName); 
    new FileIOPermission(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand(); 
    string dst = Path.GetFullPathInternal(destFileName); 
    new FileIOPermission(FileIOPermissionAccess.Write, new string[] { dst }, false, false).Demand(); 
    if (!InternalExists(fullPathInternal)) 
    { 
     __Error.WinIOError(2, fullPathInternal); 
    } 
    if (!Win32Native.MoveFile(fullPathInternal, dst)) 
    { 
     __Error.WinIOError(); 
    } 
} 

すると、ゲーム終了時に、我々はWin32Native.MoveFileへの呼び出しを持っています。以下のように定義されて ...

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
internal static extern bool MoveFile(string src, string dst); 
0

Frameworkクラスライブラリは、P /の多くは、異なるWindows API DLLを呼び出しに対して使用しています。たとえば、多くのDllImportを含むmscorlibの内部クラスMicrosoft.Win32.Win32Nativeを参照してください。たとえば、System.IO.FileStream.Readは最終的にWin32.ReadFileを使用します。

0

System.Runtime.CompilerServices.MethodImplOptions列挙型を見ると、Unmanagedフラグが設定されています。カントは本当にそれがどこで使われているかを見つける。

namespace System.Runtime.CompilerServices 
{ 
    [Flags] 
    [ComVisible(true)] 
    [Serializable] 
    public enum MethodImplOptions 
    { 
    Unmanaged = 4, 
    ForwardRef = 16, 
    PreserveSig = 128, 
    InternalCall = 4096, 
    Synchronized = 32, 
    NoInlining = 8, 
    NoOptimization = 64, 
    } 
} 
関連する問題