以下代码是否暗示方法的实现仅作为dll提供,而不包含C#源代码?

时间:2017-02-11 05:14:27

标签: c# .net http

在我正在阅读的C#代码中,有WinHttpConnect和其他方法的调用。

我猜测它们是基于System.Net中的.Net Framework类库中的方法实现的,例如WebClient,WebRequest,WebResponse或HttpClient。我想验证我的猜测,因此使用Visual Studio 2015 IDE查找它们的定义和实现位置。但我没有找到方法的实现位置,但最后在.cs文件中找到了以下代码。

  1. 以下代码是否暗示了该实现 方法是作为dll提供的,只有没有C#源代码?
  2. 某些图书馆的方法是?

    • 是否有关于的文件 方法的用法?

    • 这些库是用C#编写的吗?

    • 对于程序员来说哪个更好,方法来自的库,或System.Net下的.Net Framework类库?

  3. 感谢。

    private class NativeMethods
    {
    
    
        #region Private Constants
        private const string DllName = "WinHttp";
        #endregion
    
        #region Native Windows Class
        private static class NativeApi
        {
            [DllImport(DllName, SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "WinHttpAddRequestHeaders", CallingConvention = CallingConvention.StdCall)]
            public static extern bool WinHttpAddRequestHeaders(IntPtr requestHandle, string headers, int headersLength, uint modifiers);
    
            [DllImport(DllName, SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "WinHttpCloseHandle", CallingConvention = CallingConvention.StdCall)]
            public static extern bool WinHttpCloseHandle(IntPtr internetHandle);
    
            [DllImport(DllName, SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "WinHttpConnect", CallingConvention = CallingConvention.StdCall)]
            public static extern IntPtr WinHttpConnect(IntPtr sessionHandle, string serverName, ushort serverPort, uint reserved);
    
            ...
        }
    
        ...
    }
    

1 个答案:

答案 0 :(得分:4)

DllImport是C#中的一个特殊属性,它定义了在非托管DLL文件中实现的C#中使用的函数。

在这种情况下,DLL文件名为winhttp.dll,您可以在C:\Windows\System32文件夹中找到它。此DLL文件是一个非托管DLL文件(意味着它是使用Windows操作系统附带的本机非.NET语言编写的,如C或C ++)。

您可以找到有关WinHttpAddRequestHeaders hereWinHttpCloseHandle here以及WinHttpConnect here的文档。

如果您使用.NET语言编写程序并且可以使用.NET包装器,那么使用它们总是更明智。如果您需要调用的函数没有.NET包装器,则必须使用DllImport将函数导入C#。然后你可以编写自己的.NET包装器(这基本上是微软用这3个函数做的)。

此外,如果您需要在应用程序中使用非托管DLL但不确定如何声明[DllImport]属性,则会有一个名为pinvoke的站点,其中包含许多常见的非托管列表DLL文件并为您提供正确的[DllImport]方法。

由于WinHttp.Dll是Windows操作系统的一部分,而Windows源代码是专有的,因此您可能无法找到它的源代码。但是,如果你真的想“了解它的工作原理”,那么Wine是一个允许Linux运行Windows应用程序的Linux程序。它通过模拟底层系统DLL文件来实现。 Wine是开源的,您可以看到它们implemented WinHttp.dll的源代码。请记住,这不是Microsoft代码,而Wine可能会实现DLL有点不同。但它应该让你知道发生了什么。