ページ 11

C#使用時のエラー

Posted: 2016年4月21日(木) 23:01
by baby2478nishi
こんばんは。

今WPFアプリケーションをC#/XAMLで作っているのですがエラーが出ました。
ただ、その原因がわからないので教えていただければ幸いです。
なお、プログラムの大半はUPnP関連です。(参考にしたのはhttps://github.com/ttsuki/ttsuki/blob/master/Net/UPnPWanService.csです)

コード:

//MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.Security;
using System.Collections;
using System.Net;

namespace WPF
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            this.info1.DataContext = "Booting…";
        }
        private void button_Copy_Click(object sender, RoutedEventArgs e)
        {
            this.info1.DataContext = "Closing…";
        }

        private void button_Click_1(object sender, RoutedEventArgs e)
        {
            this.info1.DataContext = "Restarting…";
        }

        private void button_Click_2(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void settings_Click(object sender, RoutedEventArgs e)
        {
            /*class SubViewModel : Settings1
                {
                    public SubViewModel()
                        {
                        }
                }
        }*/
            // MainWindow の ViewModel
            /*class MainViewModel : Settings1
            {
                public ICommand OpenSubWindowCommand { get; private set; }

                public MainViewModel()
                {
                    OpenSubWindowCommand = CreateCommand(v =>
                    {
                        App app = App.Current as App;
                        app.ShowModalView(new SubViewModel());
                    });
                }
            }*/
        }

        private void button_Click_3(object sender, RoutedEventArgs e)
        {
            namespace Tsukikage.Net
            {
                /// <summary>
                /// UPnPを使って、いわゆる「ルータのポート穴あけ」をしてくれるクラス。
                /// </summary>
                public class UPnPWanService
                    {

                        #if BUILD_EXAMPLE
                                /// <summary>
                                /// テスト兼サンプル
                                /// </summary>
                                public static void Test()
                                {
                                    Console.WriteLine("探索中...");
                                    UPnPWanService napt = UPnPWanService.FindUPnPWanService();

                                    if (napt == null)
                                    {
                                        Console.WriteLine("みつからぬ");
                                        return;
                                    }

                                    IPAddress extIP = napt.GetExternalIPAddress();
                                    IPAddress myIP = napt.GetLocalIPAddress();

                                    Console.WriteLine("現在のポートマッピングs");
                                    foreach (var e in napt.GetGenericPortMappingEntries())
                                        Console.WriteLine("[{0}] {1}:{2} -> {3}:{4} : {5}", e.Protocol, extIP, e.ExternalPort, e.InternalClient, e.InternalPort, e.PortMappingDescription);

                                    Console.WriteLine("ポートマッピング追加。");
                                    napt.AddPortMapping(null, 12345, "TCP", 65432, myIP, true, "Test Port mapping", 0);

                                    Console.WriteLine("現在のポートマッピングs");
                                    foreach (var e in napt.GetGenericPortMappingEntries())
                                        Console.WriteLine("[{0}] {1}:{2} -> {3}:{4} : {5}", e.Protocol, extIP, e.ExternalPort, e.InternalClient, e.InternalPort, e.PortMappingDescription);

                                    Console.WriteLine("ポートマッピング削除。");
                                    napt.DeletePortMapping(null, 12345, "TCP");

                                    Console.WriteLine("現在のポートマッピングs");
                                    foreach (var e in napt.GetGenericPortMappingEntries())
                                        Console.WriteLine("[{0}] {1}:{2} -> {3}:{4} : {5}", e.Protocol, extIP, e.ExternalPort, e.InternalClient, e.InternalPort, e.PortMappingDescription);
                                }
                        #endif

            /// <summary>
            /// ネットワーク内の UPnP Wan サービスを探す。ちょっと時間がかかる。
            /// 見つからなかったときはnullが返るので気をつける。
            /// </summary>
            /// <returns></returns>
            public static UPnPWanService FindUPnPWanService()
                {
                    Guid UPnPDeviceFinderClass = new Guid("E2085F28-FEB7-404A-B8E7-E659BDEAAA02");
                    IUPnPDeviceFinder finder = Activator.CreateInstance(Type.GetTypeFromCLSID(UPnPDeviceFinderClass)) as IUPnPDeviceFinder;

                    string[] deviceTypes = { "urn:schemas-upnp-org:service:WANPPPConnection:1", "urn:schemas-upnp-org:service:WANIPConnection:1", };
                    string[] serviceNames = { "urn:upnp-org:serviceId:WANPPPConn1", "urn:upnp-org:serviceId:WANIPConn1", };
                    foreach (string deviceType in deviceTypes)
                        foreach (IUPnPDevice device in finder.FindByType(deviceType, 0))
                            foreach (string serviceName in serviceNames)
                                foreach (IUPnPService service in device.Services)
                                    return new UPnPWanService() { service = service };
                    return null;
                }

            IUPnPService service;
            private UPnPWanService() { }

            static void ThrowForHR(string action, HRESULT_UPnP hr, object result)
                {
                    if (hr != HRESULT_UPnP.S_OK)
                        throw new COMException("Action " + action + " returns " + hr + " " + result, (int)hr);
                }

            /// <summary>
            /// ポートマッピングを追加する。
            /// </summary>
            /// <param name="remoteHost">通信相手。通信先を限定する場合に指定。</param>
            /// <param name="externalPort">グローバルポート番号。</param>
            /// <param name="protocol">プロトコル名。"TCP" or "UDP"を指定。</param>
            /// <param name="internalPort">内部クライアントのポート番号。</param>
            /// <param name="internalClient">内部クライアントのIPアドレス。</param>
            /// <param name="description">説明。任意。</param>
            /// <param name="leaseDuration">リース期間(秒単位)。0を指定すると無期限</param>
            public void AddPortMapping(string remoteHost, ushort externalPort, string protocol, ushort internalPort, IPAddress internalClient, bool enabled, string description, uint leaseDuration)
                {
                    if (string.IsNullOrEmpty(remoteHost)) remoteHost = "";
                    if (string.IsNullOrEmpty(description)) description = "";
                    if (protocol != "TCP" && protocol != "UDP") throw new ArgumentException("protocol must be \"TCP\" or \"UDP\"", protocol);

                    object outArgs = null;
                    object result = null;
                    HRESULT_UPnP hresult = service.InvokeAction("AddPortMapping",
                        new object[] { remoteHost, externalPort, protocol, internalPort, internalClient.ToString(), enabled, description, leaseDuration },
                        ref outArgs, out result);
                    ThrowForHR("AddPortMapping", hresult, result);
                }

            /// <summary>
            /// ポートマッピングを追加する。
            /// </summary>
            /// <param name="portMapping">追加するポートマッピング</param>
            public void AddPortMapping(UPnPPortMapping portMapping)
                {
                    AddPortMapping(portMapping.RemoteHost, portMapping.ExternalPort, portMapping.Protocol, portMapping.InternalPort,
                        portMapping.InternalClient, portMapping.Enabled, portMapping.PortMappingDescription, portMapping.LeaseDuration);
                }

            /// <summary>
            /// ポートマッピングを削除する。
            /// </summary>
            /// <param name="remoteHost">追加時に指定した通信相手。</param>
            /// <param name="externalPort">追加時に指定した外部ポート番号。</param>
            /// <param name="protocol">追加時に指定されたプロトコル。</param>
            public void DeletePortMapping(string remoteHost, ushort externalPort, string protocol)
                {
                    if (string.IsNullOrEmpty(remoteHost)) remoteHost = "";
                    if (protocol != "TCP" && protocol != "UDP") throw new ArgumentException("protocol must be \"TCP\" or \"UDP\"", protocol);

                    object outArgs = null;
                    object result = null;
                    HRESULT_UPnP hresult = service.InvokeAction("DeletePortMapping", new object[] { remoteHost, externalPort, protocol }, ref outArgs, out result);
                    ThrowForHR("DeletePortMapping", hresult, result);
                }

            /// <summary>
            /// ポートマッピングを削除する。
            /// </summary>
            /// <param name="portMapping">削除するポートマッピング。RemoteHostとExternalPortとProtocolだけが使われる。</param>
            public void DeletePortMapping(UPnPPortMapping portMapping)
                {
                    DeletePortMapping(portMapping.RemoteHost, portMapping.ExternalPort, portMapping.Protocol);
                }

            /// <summary>
            /// 現在設定されているポートマッピング情報を得る。
            /// </summary>
            /// <returns>ポートマッピング情報</returns>
            public List<UPnPPortMapping> GetGenericPortMappingEntries()
                {
                    object outArgs = null;
                    object result = null;
                    List<UPnPPortMapping> list = new List<UPnPPortMapping>(16);
                    for (int i = 0; ; i++)
                    {
                        HRESULT_UPnP hresult = service.InvokeAction("GetGenericPortMappingEntry", new object[] { i }, ref outArgs, out result);
                        if (hresult != HRESULT_UPnP.S_OK) break;

                        object[] array = (object[])outArgs;
                        list.Add(new UPnPPortMapping
                        {
                            RemoteHost = (string)array[0],
                            ExternalPort = (ushort)array[1],
                            Protocol = (string)array[2],
                            InternalPort = (ushort)array[3],
                            InternalClient = IPAddress.Parse((string)array[4]),
                            Enabled = (bool)array[5],
                            PortMappingDescription = (string)array[6],
                            LeaseDuration = (uint)array[7],
                        });
                    }
                    return list;
                }

            /// <summary>
            /// グローバルIPアドレスを得る。
            /// </summary>
            /// <returns>IPアドレス</returns>
            public System.Net.IPAddress GetExternalIPAddress()
            {
                object outArgs = null;
                object result = null;
                HRESULT_UPnP hresult = service.InvokeAction("GetExternalIPAddress", new object[] { }, ref outArgs, out result);
                ThrowForHR("GetExternalIPAddress", hresult, result);
                return IPAddress.Parse((string)((object[])outArgs)[0]);
            }

            /// <summary>
            /// 自分のIPアドレス(v4)を得る。
            /// </summary>
            /// <returns>IPアドレス</returns>
            public System.Net.IPAddress GetLocalIPAddress()
            {
                IPAddress[] address = Array.FindAll(Dns.GetHostAddresses(Dns.GetHostName()),
                    a => a.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
                if (address.Length > 0) return address[0];
                return null;
            }

            #region COM Interop
            [ComImport]
            [Guid("ADDA3D55-6F72-4319-BFF9-18600A539B10")]
            [InterfaceType(ComInterfaceType.InterfaceIsDual)]
            [SuppressUnmanagedCodeSecurity]
            interface IUPnPDeviceFinder
            {
                [DispId(1610744809)]
                IUPnPDevices FindByType(string bstrTypeURI, int dwFlags);
                [DispId(1610744812)]
                int CreateAsyncFind(string bstrTypeURI, int dwFlags, object punkDeviceFinderCallback);
                [DispId(1610744813)]
                void StartAsyncFind(int lFindData);
                [DispId(1610744814)]
                void CancelAsyncFind(int lFindData);
                [DispId(1610744811)]
                IUPnPDevice FindByUDN(string bstrUDN);
            }

            [ComImport]
            [Guid("3D44D0D1-98C9-4889-ACD1-F9D674BF2221")]
            [InterfaceType(ComInterfaceType.InterfaceIsDual)]
            [SuppressUnmanagedCodeSecurity]
            interface IUPnPDevice
            {
                [DispId(1610747809)]
                bool IsRootDevice { get; }
                [DispId(1610747810)]
                IUPnPDevice RootDevice { get; }
                [DispId(1610747811)]
                IUPnPDevice ParentDevice { get; }
                [DispId(1610747812)]
                bool HasChildren { get; }
                [DispId(1610747813)]
                IUPnPDevices Children { get; }
                [DispId(1610747814)]
                string UniqueDeviceName { get; }
                [DispId(1610747815)]
                string FriendlyName { get; }
                [DispId(1610747816)]
                string Type { get; }
                [DispId(1610747817)]
                string PresentationURL { get; }
                [DispId(1610747818)]
                string ManufacturerName { get; }
                [DispId(1610747819)]
                string ManufacturerURL { get; }
                [DispId(1610747820)]
                string ModelName { get; }
                [DispId(1610747821)]
                string ModelNumber { get; }
                [DispId(1610747822)]
                string Description { get; }
                [DispId(1610747823)]
                string ModelURL { get; }
                [DispId(1610747824)]
                string UPC { get; }
                [DispId(1610747825)]
                string SerialNumber { get; }
                [DispId(1610747827)]
                string IconURL(string bstrEncodingFormat, int lSizeX, int lSizeY, int lBitDepth);
                [DispId(1610747828)]
                IUPnPServices Services { get; }
            }


            [ComImport]
            [Guid("FDBC0C73-BDA3-4C66-AC4F-F2D96FDAD68C")]
            [InterfaceType(ComInterfaceType.InterfaceIsDual)]
            [SuppressUnmanagedCodeSecurity]
            interface IUPnPDevices : IEnumerable
            {
                [DispId(1610747309)]
                int Count { get; }

                [DispId(-4)]
                [TypeLibFunc(TypeLibFuncFlags.FHidden | TypeLibFuncFlags.FRestricted)]
                new IEnumerator GetEnumerator();

                [DispId(0)]
                IUPnPDevice this[string bstrUDN] { get; }
            }

            [ComImport]
            [Guid("3F8C8E9E-9A7A-4DC8-BC41-FF31FA374956")]
            [InterfaceType(ComInterfaceType.InterfaceIsDual)]
            [SuppressUnmanagedCodeSecurity]
            interface IUPnPServices : IEnumerable
            {
                [DispId(1610745809)]
                int Count { get; }

                [DispId(-4)]
                [TypeLibFunc(TypeLibFuncFlags.FHidden | TypeLibFuncFlags.FRestricted)]
                new IEnumerator GetEnumerator();

                [DispId(0)]
                IUPnPService this[string bstrServiceId] { get; }
            }

            [ComImport]
            [Guid("A295019C-DC65-47DD-90DC-7FE918A1AB44")]
            [InterfaceType(ComInterfaceType.InterfaceIsDual)]
            [SuppressUnmanagedCodeSecurity]
            interface IUPnPService
            {
                [PreserveSig]
                [DispId(1610746309)]
                HRESULT_UPnP QueryStateVariable(string bstrVariableName, out /*VARIANT*/ object pvarValue);
                [PreserveSig]
                [DispId(1610746310)]
                HRESULT_UPnP InvokeAction(string bstrActionName, /*VARIANT*/ object vInActionArgs, ref /*VARIANT*/ object pvOutActionArgs, out /*VARIANT*/ object pvarRetVal);

                [DispId(1610746311)]
                string ServiceTypeIdentifier { get; }
                [DispId(1610746312)]
                void AddCallback(/*IUnknown*/ object pUnkCallback);
                [DispId(1610746313)]
                string Id { get; }
                [DispId(1610746314)]
                int LastTransportStatus { get; }
            }

            enum HRESULT_UPnP : int
            {
                S_OK = 0,
                UPNP_FACILITY_ITF = -2147221504,
                UPNP_E_ROOT_ELEMENT_EXPECTED = UPNP_FACILITY_ITF + 0x0200,
                UPNP_E_DEVICE_ELEMENT_EXPECTED,
                UPNP_E_SERVICE_ELEMENT_EXPECTED,
                UPNP_E_SERVICE_NODE_INCOMPLETE,
                UPNP_E_DEVICE_NODE_INCOMPLETE,
                UPNP_E_ICON_ELEMENT_EXPECTED,
                UPNP_E_ICON_NODE_INCOMPLETE,
                UPNP_E_INVALID_ACTION,
                UPNP_E_INVALID_ARGUMENTS,
                UPNP_E_OUT_OF_SYNC,
                UPNP_E_ACTION_REQUEST_FAILED,
                UPNP_E_TRANSPORT_ERROR,
                UPNP_E_VARIABLE_VALUE_UNKNOWN,
                UPNP_E_INVALID_VARIABLE,
                UPNP_E_DEVICE_ERROR,
                UPNP_E_PROTOCOL_ERROR,
                UPNP_E_ERROR_PROCESSING_RESPONS,
                UPNP_E_DEVICE_TIMEOUT,
                UPNP_E_INVALID_DOCUMENT = UPNP_FACILITY_ITF + 0x0500,
                UPNP_E_EVENT_SUBSCRIPTION_FAILED,
                UPNP_E_ACTION_SPECIFIC_BASE = UPNP_FACILITY_ITF + 0x0300,
                UPNP_E_ACTION_SPECIFIC_MAX = UPNP_E_ACTION_SPECIFIC_BASE + 0x0258,
            }
            #endregion

        public class UPnPPortMapping
        {
            public string RemoteHost { get; set; }
            public ushort ExternalPort { get; set; }
            public string Protocol { get; set; }
            public ushort InternalPort { get; set; }
            public IPAddress InternalClient { get; set; }
            public bool Enabled { get; set; }
            public string PortMappingDescription { get; set; }
            public uint LeaseDuration { get; set; }
        }
            }
        }
    }
}
以上がコード(C#)となります。

XAMlは

コード:

<Window x:Class="WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF"
        mc:Ignorable="d"
        Title="xxx" Height="400" Width="600">
    
    <Grid>
        <Button x:Name="start" Content="起動" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Height="60" Margin="10,8,0,0" Click="button_Click"/>
        <Button x:Name="shutdown" Content="終了" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Height="60" Margin="75,8,0,0" Click="button_Copy_Click"/>
        <Rectangle Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="2" Margin="-8,75,0,0" Stroke="Black" VerticalAlignment="Top" Width="600"/>
        <TextBlock x:Name="info1" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Margin="10,82,0,0" Width="488" Text="{Binding}"/>
        <Button x:Name="restart" Content="再起動" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Margin="140,8,0,0" Height="60" Click="button_Click_1"/>
        <Button x:Name="close" Content="閉じる" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Margin="475,10,0,0" Height="60" Click="button_Click_2"/>
        <Button x:Name="settings" Content="設定" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Margin="205,8,0,0" Height="60" Click="settings_Click"/>
        <Button x:Name="button" Content="ポート開放" HorizontalAlignment="Left" Margin="270,8,0,0" VerticalAlignment="Top" Width="60" Height="60" RenderTransformOrigin="0.565,0.225" Click="button_Click_3"/>

    </Grid>
</Window>

また、エラーの内容は
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー CS1022 型、名前空間の定義、またはファイルの終わりが必要です。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 436 アクティブ
エラー CS1513 } が必要です。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 79 アクティブ
エラー CS1513 } が必要です。 WPF F:\WPF\WPF\WPF\MainWindow.xaml.cs 79 アクティブ

というものです。}についても一度検証してみましたがわかりませんでした。

開発環境はVisualStudio 2015 Communityです。
よろしくお願いします。

Re: C#使用時のエラー

Posted: 2016年4月21日(木) 23:57
by みけCAT
baby2478nishi さんが書きました:

コード:

namespace WPF
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {

コード:

        private void button_Click_3(object sender, RoutedEventArgs e)
        {
            namespace Tsukikage.Net
            {
                /// <summary>
                /// UPnPを使って、いわゆる「ルータのポート穴あけ」をしてくれるクラス。
                /// </summary>
                public class UPnPWanService
                    {
この中のどれかの{に対応する}が無いようですね。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 13:43
by YuO
メソッド中にnamespaceを入れることは出来ません。
プロジェクトにUPnPWanService.csを追加し,そこにTsukikage.Net.UPnPWanServiceクラスを書いてください。

というか,元は https://github.com/ttsuki/ttsuki/blob/m ... Service.cs でしょうか。
であれば,https://raw.githubusercontent.com/ttsuk ... Service.csをそのまま保存して,プロジェクトにファイルを追加すればよいかと思います。
もちろん,名前空間が違うため,最初にusingが必要になりますが。
オフトピック
C#erとしてはいろいろ言いたいことはありますが……。

TextBlock.Textが{Binding}でTextBlock.DataContextに文字列入れて変更しているところとか (TextBlock.Textに代入すればよいのでは),
GridなのにMarginによる位置指定をしているとか (Windowの拡大縮小でレイアウトが崩れる)。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 17:59
by baby2478nishi
返信が遅れてすみません。

当初、YuOさんの書かれたように参照する形でやろうとしたのですが方法がわからず、そのままぶちこむ、という形になりました。

そこでYuOさんの書かれたようにしてみたのですが、usingの後に追加するのは

コード:

using UPnPWanService.cs;
ではないのでしょうか?それともほかの何かでしょうか?

また、みけCATさん、回答していただいたのですがYuO三の方法を採用させていただきます。申し訳ありません。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 18:11
by baby2478nishi
すみませんできました。解決とさせていただきます。
ありがとうございました。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 18:17
by YuO
書いている間に解決となりましたが,一応送信しておきます。
baby2478nishi さんが書きました:そこでYuOさんの書かれたようにしてみたのですが、usingの後に追加するのは

コード:

using UPnPWanService.cs;
ではないのでしょうか?それともほかの何かでしょうか?
usingの後ろに書くには,ファイル名ではなく名前空間名です。
今回の場合,利用するクラスはTsukikage.Net.UPnPWanServiceなので,名前空間はTsukikage.Netです。
よって,

コード:

using Tsukikage.Net;
が必要になります。

ただし,Visual Studioで開発している場合,usingは自分で書く必要は無く,UPnPWanServiceと書いた後Ctrl + .を押して
  • ファイルにusingを追加する
  • 完全修飾名に変更する (UPnPWanServiceをTsukikage.Net.UPnPWanServiceに変更する)
といったことができます。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 18:50
by sleep
形式的な注意事項を挙げておきます。

Remarksに書かれてますが、UIスレッドから直接呼び出すことは避けてください。
IUPnPDeviceFinder::FindByType method
This method must not be called from a thread that processes user interface messages.

あと、COMのタイプライブラリに UPnP 1.0 Type Library (Control Point) というものがあるので
C#でUPnPを使用するなら態々そんな遠まわしなコードを利用する必要はあまりありません。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 21:40
by baby2478nishi
>>YuOさん
そのようですね。僕もふと思いそうしてみたところで来ました。

>>sleepさん
そうだったんですね!でも、GUIならどこからすればよいのでしょうか?
mata,
COMにあるとの情報ありがとうございます!

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 21:45
by baby2478nishi
ただ、ネットを探してもUPnP 1.0 type libraryに関する情報が見つからないです…。
オブジェクトブラウザーからそれっぽいものを探すしかないのでしょうか?

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 22:35
by sleep
baby2478nishi さんが書きました: >>sleepさん
そうだったんですね!でも、GUIならどこからすればよいのでしょうか?
MSDNに記載されている注意事項を守るのであれば、UIスレッド以外から使用してあげてください。
baby2478nishi さんが書きました:ただ、ネットを探してもUPnP 1.0 type libraryに関する情報が見つからないです…。
分からなければ無理に利用する必要はないです。やっていることは一緒です。
今の時点で全く理解されてないご様子なので、今の自分の力で使用できる方をご使用ください。

Re: C#使用時のエラー

Posted: 2016年4月22日(金) 22:50
by baby2478nishi
わかりました。頑張ってみます。