在我正在阅读的C#代码中,有WinHttpConnect
和其他方法的调用。
我猜测它们是基于System.Net
中的.Net Framework类库中的方法实现的,例如WebClient,WebRequest,WebResponse或HttpClient。我想验证我的猜测,因此使用Visual Studio 2015 IDE查找它们的定义和实现位置。但我没有找到方法的实现位置,但最后在.cs文件中找到了以下代码。
某些图书馆的方法是?
是否有关于的文件 方法的用法?
这些库是用C#编写的吗?
对于程序员来说哪个更好,方法来自的库,或System.Net
下的.Net Framework类库?
感谢。
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);
...
}
...
}
答案 0 :(得分:4)
DllImport是C#中的一个特殊属性,它定义了在非托管DLL文件中实现的C#中使用的函数。
在这种情况下,DLL文件名为winhttp.dll
,您可以在C:\Windows\System32
文件夹中找到它。此DLL文件是一个非托管DLL文件(意味着它是使用Windows操作系统附带的本机非.NET语言编写的,如C或C ++)。
您可以找到有关WinHttpAddRequestHeaders here和WinHttpCloseHandle 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有点不同。但它应该让你知道发生了什么。