我最近从VS2010升级到VS2012,模拟器现在是一个虚拟机,这意味着我之前使用/ localhost / service /完成的本地运行服务的调用现在不再有效。我需要使用实际机器的IP地址才能看到它。
这会产生两个问题: 1)我经常需要脱机工作,所以我不确定是否有一个IP地址可供使用 2)不会使共享代码变得困难,因为每个人都必须不断更新代码才能在本地运行它吗?
我似乎更容易错过一些非常简单的事情,因为我还没有看到解决这些问题的任何事情,我想这会是非常的常见用法。大多数应用程序需要访问外部服务,如果您在调试中运行,则很可能需要在本地运行它们。
答案 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;。