Недавно я обновился от VS2010 до VS2012, и эмулятор теперь является виртуальной машиной, а это означает, что мои предыдущие вызовы для службы, выполняемой локально, которые были выполнены с использованием /localhost/service/теперь больше не работают. Мне нужно использовать IP-адрес фактического компьютера, чтобы вызовы его увидели.
Это создает две проблемы: 1) Мне часто приходится работать в автономном режиме, поэтому я не уверен, что есть IP-адрес, который нужно использовать вообще. 2) Не делает ли код обмена сложным, так как каждый человек будет постоянно обновлять код чтобы запустить его локально?
Кажется более вероятным, что я пропустил что-то очень простое, потому что я не видел ничего, что касалось этих проблем, и я бы предположил, что это очень распространенное использование. В большинстве приложений требуется доступ к внешним службам, и, более вероятно, если вы работаете в отладке, вы хотите запустить их локально.
Вы можете решить свою проблему, включив в свой проект телефона 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, затем "Transform All T4 Templates".
System.Management
похоже, отсутствует в телефоне.