0

目標: Windows Phone 7 の名前 (「My Windows Phone」など) を取得する。

リード: http://blogs.msdn.com/b/andypennell/archive/2013/11/09/getting-the-name-of-your-windows-phone-8-device.aspx

上記のコードは C++ で提供されていますが、C# に変更したいと考えています。理由の 1 つは、私が Visual Studio 2012 Express しか持っておらず、C++ を Windows Phone プロジェクトと一緒に使用することができず、VS2013 を既に購入しているため、これだけのために VS2012 を購入する余裕がないためです。もう 1 つの理由は、C++ の依存ファイルが 150 を超えていることです。これはコードが多すぎます。

だから、私の最初の試み:(http://www.experts-exchange.com/Programming/Languages/.NET/Q_21014265.htmlに触発された)

    [StructLayout(LayoutKind.Sequential)]
    internal struct WSAData
    {
        public short wVersion;
        public short wHighVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
        public string szDescription;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
        public string szSystemStatus;
        public short iMaxSockets;
        public short iMaxUdpDg;
        public int lpVendorInfo;
    }

    [DllImport("wsock32.dll")]
    internal static extern int WSAStartup(
          [In] short wVersionRequested,
          [Out] out WSAData lpWSAData
          );

    [DllImport("wsock32.dll")]
    internal static extern int WSACleanup();

    public static void Test()
    {
        WSAData dummy;
        WSAStartup(0x0002, out dummy);
        // TODO: more stuff
        WSACleanup();
    }

WSAStartup(0x0002, out dummy);例外で失敗します:

MyLibrary.dll で、タイプ 'System.MethodAccessException' の初回例外が発生しました

追加情報: メソッドにアクセスしようとして失敗しました: MyLibrary.WSAStartup(System.Int16, .WSAData&)

そして私の2回目の試み:( Convert service name to port に触発された)

    [StructLayout(LayoutKind.Sequential)]
    public struct WSAData
    {
        public short version;
        public short highVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
        public string description;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
        public string systemStatus;
        public short maxSockets;
        public short maxUdpDg;
        public IntPtr vendorInfo;
    }

    internal static class NativeMethods
    {
        [DllImport("Ws2_32.dll")]
        public static extern Int32 WSAStartup(short wVersionRequested, ref WSAData wsaData);

        [DllImport("Ws2_32.dll")]
        public static extern Int32 WSACleanup();
    }

    public static void Test()
    {
        WSAData dummy = new WSAData();
        NativeMethods.WSAStartup(0x0202, ref dummy);
        // TODO: more stuff
        NativeMethods.WSACleanup();
    }

NativeMethods.WSAStartup(0x0202, ref dummy);例外で失敗します:

MyLibrary.dll で、タイプ 'System.MethodAccessException' の初回例外が発生しました

追加情報: メソッドにアクセスしようとして失敗しました: MyLibrary+NativeMethods.WSAStartup(System.Int16, .WSAData&)

WP7 デバイスで動作させるためのアドバイスはありますか?

[編集:この投稿は、バージョン 0x0101 で WSAStartup() を使用する可能性も示唆しています]

4

2 に答える 2

2

WSAStartup 内部専用の SecurityCriticalAttributeがあり、アプリケーションからは使用できません。

PInvoke は Windows Phone 7 アプリでは許可されていません。

于 2014-09-22T11:25:50.123 に答える
0

WP7 では、C++ ではなく C# コードを使用できます。また、ソケットの C# 実装により、手動で WSAStartup() を呼び出す必要はありません。システムが自動的に呼び出します。

于 2014-09-22T11:36:06.167 に答える