将Windows Phone 8仿真程序连接到主机

时间:2014-05-22 18:47:48

标签: c# .net windows-phone-8 windows-phone hyper-v

我最近从VS2010升级到VS2012,模拟器现在是一个虚拟机,这意味着我之前使用/ localhost / service /完成的本地运行服务的调用现在不再有效。我需要使用实际机器的IP地址才能看到它。

这会产生两个问题: 1)我经常需要脱机工作,所以我不确定是否有一个IP地址可供使用 2)不会使共享代码变得困难,因为每个人都必须不断更新代码才能在本地运行它吗?

我似乎更容易错过一些非常简单的事情,因为我还没有看到解决这些问题的任何事情,我想这会是非常的常见用法。大多数应用程序需要访问外部服务,如果您在调试中运行,则很可能需要在本地运行它们。

1 个答案:

答案 0 :(得分:0)

您可以通过在Windows手机项目中加入以下T4模板来解决您的问题:

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Management" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Management" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
using System.Net;

public static class SelfIpAddress
{
    public static readonly IPAddress dbgHostAddress = new IPAddress( new byte[ 4 ] { <#= String.Join( ", ", address ) #> } );
}<#+
    static IEnumerable<ManagementObject> searchWmi( string q )
    {
        var mos = new ManagementObjectSearcher( q );
        return mos.Get().Cast<ManagementObject>();
    }

    static byte[] findTheAddress()
    {
        string q1 = @"SELECT * FROM Win32_NetworkAdapter where ServiceName='VMSMP' and NetConnectionID is not NULL";

        ManagementObject adapter = searchWmi( q1 ).Where( mo => mo[ "NetConnectionID" ].ToString().Contains( "Emulator Internal Switch" ) ).FirstOrDefault();
        if( null == adapter )
            throw new Exception( "Network adapter was not found" );

        int interfaceIndex = int.Parse( adapter[ "InterfaceIndex" ].ToString() );

        string q2 = @"SELECT * FROM Win32_NetworkAdapterConfiguration where InterfaceIndex = " + interfaceIndex.ToString();
        ManagementObject adapterConfig = searchWmi( q2 ).FirstOrDefault();
        string address = ( adapterConfig[ "IPAddress" ] as string[] ).FirstOrDefault();
        if( null == address )
            throw new Exception( "Network adapter has no address" );
        return address.Split( '.' ).Select( c => byte.Parse( c ) ).ToArray();
    }

    readonly byte[] address = findTheAddress();
#>

在我的机器上,它会生成以下源文件:

using System.Net;

public static class SelfIpAddress
{
    public static readonly IPAddress dbgHostAddress = new IPAddress( new byte[ 4 ] { 169, 254, 80, 80 } );
}

然后在您的代码中,您可以使用SelfIpAddress.dbgHostAddress值来访问您的主机。就像在项目上工作的其他人一样。要刷新该值,请按BUILD,然后按&#34;转换所有T4模板&#34;。