C#代理控制台无法正常工作

时间:2014-04-06 07:48:01

标签: c# .net vb.net

将VB代码转换为C#代码时遇到问题。这是VB中的代码,

<Runtime.InteropServices.DllImport("wininet.dll", SetLastError:=True)> _
    Private Shared Function InternetSetOption(ByVal hInternet As IntPtr, ByVal dwOption As Integer, ByVal lpBuffer As IntPtr, ByVal lpdwBufferLength As Integer) As Boolean
    End Function

    Public Structure Struct_INTERNET_PROXY_INFO
        Public dwAccessType As Integer
        Public proxy As IntPtr
        Public proxyBypass As IntPtr
    End Structure

    Private Sub UseProxy(ByVal strProxy As String)
        Const INTERNET_OPTION_PROXY As Integer = 38
        Const INTERNET_OPEN_TYPE_PROXY As Integer = 3

        Dim struct_IPI As Struct_INTERNET_PROXY_INFO

        struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY
        struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy)
        struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local")

        Dim intptrStruct As IntPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI))

        Marshal.StructureToPtr(struct_IPI, intptrStruct, True)

        Dim iReturn As Boolean = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, System.Runtime.InteropServices.Marshal.SizeOf(struct_IPI))
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label4.Text = (TextBox1.Text & ":" & TextBox2.Text)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        UseProxy(Label4.Text)
        WebBrowser1.Navigate(TextBox3.Text)
    End Sub

我尝试使用一些在线转换器来转换此代码,我得到了相同的结果。这是c#代码,

[Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
private static bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength)
{
}

public struct Struct_INTERNET_PROXY_INFO
{
    public int dwAccessType;
    public IntPtr proxy;
    public IntPtr proxyBypass;
}

private void UseProxy(string strProxy)
{
    const int INTERNET_OPTION_PROXY = 38;
    const int INTERNET_OPEN_TYPE_PROXY = 3;

    Struct_INTERNET_PROXY_INFO struct_IPI = default(Struct_INTERNET_PROXY_INFO);

    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
    struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

    IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));

    Marshal.StructureToPtr(struct_IPI, intptrStruct, true);

    bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, System.Runtime.InteropServices.Marshal.SizeOf(struct_IPI));
}

private void Button1_Click(System.Object sender, System.EventArgs e)
{
    Label4.Text = (TextBox1.Text + ":" + TextBox2.Text);

}

private void Button2_Click(System.Object sender, System.EventArgs e)
{
    UseProxy(Label4.Text);
    WebBrowser1.Navigate(TextBox3.Text);
}

我正在使用VS 12,在Windows窗体应用程序中,代码给出了一个错误,

  

错误2'WindowsFormsApplication1.Form1.InternetSetOption(System.IntPtr,int,System.IntPtr,int)':并非所有代码路径都返回值

     

错误1找不到类型或命名空间名称'Runtime'(您是否缺少using指令或程序集引用?)

我尝试了using System.Runtimeusing System.Runtime.InteropServicesSystem.Runtime.InteropServices.WindowsRuntime,但没有用。

我有一个控制台应用程序,它发送httpwebrequest并做一些工作。所以我在某种程度上需要程序在连接时使用代理。因此,当程序启动时,它也将启动代理,程序发送的所有请求将使用代理。

我还希望代理只影响程序而不是所有计算机,因为我希望用户能够自由地浏览计算机。

- Edit-- 我有一个上面的解决方案。现在这就是问题所在。 现在这段代码似乎不适用于控制台应用程序。我用了

static void Main()
        {
            Console.WriteLine("Ip before Proxy /r/n");
            HTTPGet req = new HTTPGet();
            req.Request("http://checkip.dyndns.org");
            string[] a = req.ResponseBody.Split(':');
            string a2 = a[1].Substring(1);
            string[] a3 = a2.Split('<');
            string a4 = a3[0];
            Console.WriteLine(a4);

            UseProxy("219.93.183.106:8080");
            Console.WriteLine("Ip after Proxy /r/n");
            HTTPGet req1 = new HTTPGet();
            req1.Request("http://checkip.dyndns.org");
            string[] a1 = req1.ResponseBody.Split(':');
            string a21 = a1[1].Substring(1);
            string[] a31 = a21.Split('<');
            string a41 = a31[0];
            Console.WriteLine(a41);
            Console.ReadLine();
        }

我得到的结果都是我的IP。 HTTPGet是堆栈溢出中此问题的一个类:c# - Get public/external IP address?

有关如何在控制台上使用它的任何帮助?或者我做错了什么?

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试执行此操作:How do I use InternetSetOption?

注意互操作的定义:

[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(
    IntPtr hInternet,
    int dwOption,
    IntPtr lpBuffer,
    int lpdwBufferLength);

答案 1 :(得分:0)

[DllImport("wininet.dll", SetLastError = true)]
 private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

使用添加System.Runtime.InteropServices

答案 2 :(得分:0)

您只需从internetset选项中删除{ },然后在结尾处添加;即可。代码看起来像,

 [DllImport("wininet.dll", SetLastError = true)]
    private static extern bool InternetSetOption(
        IntPtr hInternet,
        int dwOption,
        IntPtr lpBuffer,
        int lpdwBufferLength);


    public struct Struct_INTERNET_PROXY_INFO
    {
        public int dwAccessType;
        public IntPtr proxy;
        public IntPtr proxyBypass;
    }

    private void UseProxy(string strProxy)
    {
        const int INTERNET_OPTION_PROXY = 38;
        const int INTERNET_OPEN_TYPE_PROXY = 3;

        Struct_INTERNET_PROXY_INFO struct_IPI = default(Struct_INTERNET_PROXY_INFO);

        struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
        struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
        struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");

        IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));

        Marshal.StructureToPtr(struct_IPI, intptrStruct, true);

        bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, System.Runtime.InteropServices.Marshal.SizeOf(struct_IPI));
    }

    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        Label4.Text = (TextBox1.Text + ":" + TextBox2.Text);

    }

    private void Button2_Click(System.Object sender, System.EventArgs e)
    {
        UseProxy(Label4.Text);
        WebBrowser1.Navigate(TextBox3.Text);
    }

我想您已经设置了对system.runtimesystem.runtime.interopservices

的引用

我已经使用两个按钮测试了这段代码,一个标签和一个webbrowser,就像在代码中一样,它们可以与hidemyass.com的一些免费代理一起使用。