Подключение эмулятора Windows Phone 8 к хост-машине

1

Недавно я обновился от VS2010 до VS2012, и эмулятор теперь является виртуальной машиной, а это означает, что мои предыдущие вызовы для службы, выполняемой локально, которые были выполнены с использованием /localhost/service/теперь больше не работают. Мне нужно использовать IP-адрес фактического компьютера, чтобы вызовы его увидели.

Это создает две проблемы: 1) Мне часто приходится работать в автономном режиме, поэтому я не уверен, что есть IP-адрес, который нужно использовать вообще. 2) Не делает ли код обмена сложным, так как каждый человек будет постоянно обновлять код чтобы запустить его локально?

Кажется более вероятным, что я пропустил что-то очень простое, потому что я не видел ничего, что касалось этих проблем, и я бы предположил, что это очень распространенное использование. В большинстве приложений требуется доступ к внешним службам, и, более вероятно, если вы работаете в отладке, вы хотите запустить их локально.

Теги:
hyper-v
windows-phone
windows-phone-8

1 ответ

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, затем "Transform All T4 Templates".

  • 0
    спасибо за вашу помощь, но похоже, что используемый вами класс недоступен в телефонной версии .net ManagementObject Class На самом деле, все пространство имен System.Management похоже, отсутствует в телефоне.
  • 0
    Это не важно Шаблоны T4 работают на вашем компьютере в вашей визуальной студии.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню