none
DLLにすると割り込み発生しない。 RRS feed

  • 質問

  • VB.NET2008、WindowsXP SP3です。
    シリアルポートを使うプログラムを作っています。
    Windowフォームの、次のプログラム


    Imports System.IO.Ports

    Public Class Form1
        Dim sp As SerialPort
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            sp = New SerialPort("COM4", 9600, Parity.None, 8, 1)
            sp.Handshake = Handshake.None
            sp.Open()
            AddHandler sp.DataReceived, AddressOf SerialPort1_DataReceived

        End Sub
        Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
            MsgBox("What?")
            If sp.IsOpen = False Then
                Return
            End If

            Dim data As String
            data = sp.ReadExisting()
            If Len(data) = 0 Then Exit Sub
            sp.WriteLine("len=" & Len(data))
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            sp.WriteLine("Hello" & vbCrLf)
        End Sub
    End Class

    つまり
      ボタン1を押すとポートを開いて受信割り込みを設定
      ボタン2を押すと書き込み
      受信割り込み発生時に"What?"と表示し、データを送り返す
    です。問題なく動作します。

    ところが、これを

    http://vbdotnet.seesaa.net/article/156679595.html

    を参考にしてDLLにすると、受信割り込みが発生しないようです。
    "What?"と表示されません。他は問題ないです。

    何故でしょうか?

    PerMLgiPmOLEIzWmgkViWgiNADMzceeeUVCccBMBJHJlmkyKFWcUBUqUrszUVaGEUnxAgYAXnrtVVTruLeiRPQlaAuOUsBEelUKj

    2012年2月10日 0:17

回答

  • 問題の本質が見えづらく、いろいろな可能性が考えられたので、論理的に否定されていなかったことを、「念のため確認しようとした」のですが、いろいろとこじれてしまいましたね、すみません。
    引っ張るのは建設的ではありませんし、必要最小限の指摘・確認にとどめることにします。

    さて、本題ですが、利用側のコードとつきあわせて DLL 側のコードを改めて見直したところ、問題がようやく見えました。SerialPortWriteLn → SerialPortWrite で sp.Close を実行している ので、書き込んだ後に受け取ることはできないのではないかと考えられます。
    少なくとも、Sleep している段階では SerialPort が閉じています。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年2月11日 13:54
    モデレータ
  •  C# では、「sp.RecievedData +=」と入力すると、自動的にスケルトン コードを生成できるのですが、VB にはそういう機能はないのですね。

    エラーメッセージの解釈は兎も角、

     う~ん。。。何らかの間違いがあるからエラーになるわけで、エラーと判断した理由を示しているメッセージの解釈を「兎も角」とうっちゃると、解決なんてできないですよ。

     COM がらみで出る NotImplementedException ということで、「com notimplementedexception」をキーに検索してみると、こんなモノが見つかりました。

    Thread._Thread.Invoke メソッドより:

    NotImplementedException
    COM IDispatch インターフェイスを使用した遅延バインディングによるアクセスはサポートされていません。

     ここから、MSDN ライブラリ内を「invoke notimplementedexception」をキーに検索しましたが、あちこちに、この記述があります。例外のスタック トレースを見ればわかるように、invoke 系のメソッドで発生しているので、これの可能性を疑います。と、言いたいところですが、_Type.InvokeMember メソッドには、そういった記述がないんですよねぇ。まぁ、これができないとなると、アン マネージからマネージ呼び出しが全部失敗するような気がする。それとも、メイン スレッド以外からの呼び出しに対応できないのだろうか?
    ただ、_Type.InvokeMember の説明に書いてあることによると、アン マネージからの呼び出しには _Type が使われるようですが、スタック トレースを見ればわかるように、実際には RuntimeType が使われています。RuntimeType は、Type の実装の一つで、これは MSDN ライブラリに記述がありません。この先は、マイクロソフトの有償サポートを利用してください。MSDN ライブラリに記述がないので、ライセンスについている無償のインシデント サポートでは無理です。


    メモ:Raising events from .NET UserControl inside a VB6 MDI form(Interop Forms Toolkit) の、Thursday, October 25, 2007 1:30 AM kevinさんの状況がとても近いような気がする。


    Jitta@わんくま同盟

    • 回答としてマーク 山本春海 2012年2月21日 5:14
    2012年2月15日 11:58

すべての返信

  • シリアルポートとは関係なく質問者さんの言う「DLLにする」が失敗していて、そもそも何もかもが動作していない可能性があります。

    まず、どのようにDLLにしたのですか? どのようにDLLを呼び出しているのですか? 本当に呼び出せているかの確認はしましたか?

    2012年2月10日 1:17
  • 既に書いているHP

    http://vbdotnet.seesaa.net/article/156679595.html

    を見ると分かりますが、VBScriptまたはHTAから呼び出します。
    有効なポートを得る(GetPortNames)、ポートを開く、送信するは問題ありません。
    ただ、受信(DataReceived)がDLLにすると割り込みが発生しないという現象です。

    2012年2月10日 1:32
  • 有効なポートを得る(GetPortNames)、ポートを開く、送信するは問題ありません。
    ただ、受信(DataReceived)がDLLにすると割り込みが発生しないという現象です。

    そもそも、GetPortNames とは何ですか?
    当初に掲載されたのは Windows Forms のイベントドリブンのコードです。あなたが「DLL にする」として書き換えたコードを見せていないのに、「割り込みが発生しない」と言われても、原因を特定することは不可能です。

    その「DLL にする」過程でミスしている可能性が否定できないので、どんな問題が起きているかがわかりません。
    (Open/Close が Form1 と関係ないところで行われているのであれば、Form1 の "What?" がでないのは当然です。それともこの Form1 や "What?" は受信側の話なのでしょうか…)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年2月10日 13:53
    モデレータ
  •  コードは、最後に掲載します。隠す意図はありませんが、

    >その「DLL にする」過程でミスしている可能性が否定できな
    >いので、どんな問題が起きているかがわかりません。

    と仰るとおりに私もDLLにする時に何らかの設定が必要かと思ったので、コードをアップする必要がないと判断しました。見て分かりますが、

    http://vbdotnet.seesaa.net/article/156679595.html

    と構成は殆ど同じです。なお、コンパイル過程も同じですが簡単に述べます。

    ●コンパイル前に
    sn.exe -k lightbox.snk

    ●コンパイル
    >vbc /target:library /keyfile:lightbox.snk util.vb

    ●登録
    >RegAsm.exe util.dll /tlb:util.tlb /codebase

    ●登録解除
    >RegAsm.exe util.dll /unregister



    >(Open/Close が Form1 と関係ないところで行われているので
    >あれば、Form1 の "What?" がでないのは当然です。それとも
    >この Form1 や "What?" は受信側の話なのでしょうか…)
     上の文章を私は解釈できません。
     私の文章が理解を苦しめているのかもしれませんが、時系列で述べると


    http://vbdotnet.seesaa.net/article/156679595.htmlのコードを元に自作コードを作成した

    しかし受信割り込みが発生しなかった

    そこで,動作確認をするために別個にIDEを使ってフォームのプログラム上にて検証した(当然だが、DLLプログラムとフォームプログラムのコードは同一ではなく、割り込み部分と周辺部のみを記述した)。

    その結果、フォームでは割り込みは発生した

    何故DLLでは発生しないのか?

    質問


    です。
     あなたは

    http://vbdotnet.seesaa.net/article/156679595.html

    を見ましたか?。これに掲載されているDLLはフォームを使っていません。

    >そもそも、GetPortNames とは何ですか?
     私の環境で、Googleで検索すると該当する内容が表示されました。それです。また、IDEのF1でも問題なく表示されます。
     先入観なく伺いますが、“そもそも、GetPortNames とは何ですか”と私に質問する意図は何ですか?答える示してくれるであろう方からとは発せされる疑問とは思えません。
     割り込み云々の前に、その意図を教えてください。




    コードは以下です。名前は<util.vb>です。
    ここから始まる--------------------------
    Imports System
    Imports System.Reflection
    Imports System.Runtime.InteropServices    ' DllImport
    Imports System.IO.Ports
    Imports System.Windows.Forms

    ' http://vbdotnet.seesaa.net/article/156679595.html

    Namespace mytools
        <Guid("D2516B86-42BC-4833-9FAC-AF75C44DF4F7"), _
        InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
        Public Interface ImytoolEvents
    '        <DispId(1)> _
    '        Sub EndDownload()
    '        <DispId(2)> _
            Sub EndDownload2( str As String )
        End Interface

        ' VB.net のイベントを COM へ公開する
        <ComSourceInterfaces(GetType(ImytoolEvents))> _
        Public Class util
            Dim sp As SerialPort
            Public Sub New ()
                MsgBox( "New" )
            End Sub
            Protected Overrides Sub Finalize()
                MsgBox( "Bye" )
            End Sub


    '        ' Win32 API を使う為の定義
    '        <DllImport("urlmon.dll", CharSet:=CharSet.Unicode)> _
    '        Private Shared Function URLDownloadToFile( _
    '          ByVal pCaller As Integer, _
    '          ByVal szURL As String, _
    '          ByVal szFileName As String, _
    '          ByVal dwReserved As Integer, _
    '          ByVal lpfnCB As Integer _
    '        ) As Integer
    '        End Function

            ' ******************************************************
            ' COM へ公開するメソッド
            ' ******************************************************
    '        Public Function funcA(target As String) As String
    ''                ' ***********************
    ''                ' イベントを発生させる
    ''                ' ***********************
    ''                RaiseEvent EndDownload()
    ''                RaiseEvent EndDownload2( target )
    '            return "fine"
    '        End Function

            Public Sub AudioPlay(s as string)
                My.Computer.Audio.Play(s, AudioPlayMode.WaitToComplete)
            end sub

            Public Sub BeepN(n as integer)
                dim i as Long
                for i = 1 to n
                    Beep()
                next
            end sub

            Public Sub ClipboardSetText(s as string)
                Clipboard.SetText(s, TextDataFormat.UnicodeText)
            end sub

            Public Function ClipboardGetText() as String
                return Clipboard.GetText
            end Function

            Public Sub SerialPortOpen(p as String)
                sp = New SerialPort(p, 9600, Parity.None, 8, 1)
                sp.Handshake = Handshake.None
                sp.Open()
                AddHandler sp.DataReceived, AddressOf SerialPort1_DataReceived
            end Sub
            Public Sub SerialPortClose()
                sp.Close()
            end Sub


            Public Sub SerialPortWrite(s As String)
                Dim dat As Byte() = _
                    System.Text.Encoding.GetEncoding("utf-8").GetBytes(s)
                sp.Write(dat, 0, dat.GetLength(0))
                sp.Close()
            end Sub

            Public Sub SerialPortWriteLn(s As String)
                SerialPortWrite(s & vbCrLf)
            end Sub

            Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
                MsgBox( "What?" )
                If sp.IsOpen = False Then
                    Return
                End If

                Dim data As String
                data = sp.ReadExisting()
                If Len(data) = 0 Then Exit Sub
                sp.WriteLine("len=" & Len(data))
                RaiseEvent EndDownload2( data )

            End Sub

            Public Function SerialPortGetPortNames() As String
                Dim ss() As String = SerialPort.GetPortNames()
                if lbound(ss) > ubound(ss) then
                    return ""
                end if

                dim ret as string
                ret = ss(0)
                dim i as long
                for i=1 to ubound(ss)
                    ret = ret & " " & ss(i)
                next
                return ret
            End Function

            ' ******************************************************
            ' COM へ公開するイベント
            ' ******************************************************
    '        Public Event EndDownload()
            Public Event EndDownload2( URL As String )
        End Class
    End Namespace
    ここまで--------------------------------

            
    2012年2月10日 20:47

  • あなたは
    http://vbdotnet.seesaa.net/article/156679595.html
    を見ましたか?。これに掲載されているDLLはフォームを使っていません。

    もちろん見ています。
    この構成を参考に、あなたがどのようなコードを書いたのかが想像できませんでしたから、どんなコードなのですかと問いました。Web サイトを参考にすれば、何でも動くわけではありません。
    また、どのようなメソッドを COM として公開しているかわからないし、掲載されているのは "Form1" なので、もしかして、Form1 を使っているのか?とか想像したというものです。

    問題が起きるコードを最初から提示してもらえれば、お互いの誤解(ロス)が少なくなると思います。

     先入観なく伺いますが、“そもそも、GetPortNames とは何ですか”と私に質問する意図は何ですか?答える示してくれるであろう方からとは発せされる疑問とは思えません。
     割り込み云々の前に、その意図を教えてください。

    あなたが作った関数なのか、クラスライブラリの関数なのか、突如として現れている文面だったので推察しづらいため、あえて質問しています。
    結果として、「あなたが同名の関数を作ってラップしていて、あなたが作った COM の関数は呼び出されている」と解釈しますが、相違ないですか?

            Public Sub SerialPortOpen(p as String)
                sp = New SerialPort(p, 9600, Parity.None, 8, 1)
                sp.Handshake = Handshake.None
                sp.Open()
                AddHandler sp.DataReceived, AddressOf SerialPort1_DataReceived
            end Sub      

    コードを見比べた上での確認ですが、VBScript や HTA では Open してから待つようなコードを入れていますか?
    元のサンプルでは、URLDownloadToFile が「ダウンロードが終わるまで待つ関数」なので、特に何もケアせずとも、受信が終わる前に VBScript が終了することはありません。
    今回のコードでは SerialPortOpen を実行してもすぐにメソッドが終了して、VBScript に戻ってくるので、受信の間、何らかの待ちコードを入れる必要があります。それはきちんと入っていると解釈して問題ないですか?

    わかりづらければ、VBScript / HTA といった利用側の最小限のコードも提示してください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年2月11日 7:50
    モデレータ
  • あなたの発言内容を読みました。
     内容の一部分だけに固執して無為に時間を費やすい意思はありません。あなたが今回の私に対して生じさせたのと同様な誤解を、他の質問者から受けないように指摘しますが、"GetPortNames"という名前が出たとき、
      自分の知識に無い
     →作った関数なのかクラスライブラリの関数なのか自分は判別できない
     →そうであるから質問者に
      “そもそも、GetPortNames とは何か?”
     と質問する
     という過程に成ったという文言は、私は50歳台のジジイですが、受容できないし私以外の年配者も同様かと思われます。不愉快です。知らないのなら調べればよいし、あなたが私の質問に答える環境にある--つまりVisualStudioのVBを利用できる環境にある--のなら"GetPortNames"をコピー・ペーストしてF1キーを押せば良いだけだと考えます。
     これ以上は書きません。あなたも不愉快なら私に返答を下さらなくて結構です。

    ---

    >コードを見比べた上での確認ですが、VBScript や HTA では Open してから待つようなコードを入れていますか?
     幾つかのサンプルを見ましたが、SerialPortOpen()を実行後に何かを待つというコードを見てません。SerialPortOpen()を呼ぶと利用可能状態になるまで帰ってこない、またはエラーになると私は理解しています。実際にフォームでのプログラムでも考慮していませんが、問題ありません。

    >今回のコードでは SerialPortOpen を実行してもすぐにメソッ
    >ドが終了して、VBScript に戻ってくるので、受信の間、何らか
    >の待ちコードを入れる必要があります。
     理解できません。
     その“待ちコード”というのは、他の処理という意味ですか?割り込みだから、割り込みを設定して以降は別の処理をしますよね。受信を待ちたいのなら割り込みなどせずにポーリングすれば良いだけです。


    呼び出し側のコードは以下です。

    ---
    Set obj = Wscript.CreateObject("mytools.util", "my_")
    obj.SerialPortOpen "COM4"
    obj.SerialPortWriteLn Now

    WScript.Sleep 1000*10


    'obj.SerialPortClose



    Sub my_EndDownload2( str )  
        MsgBox "終了イベント:" & str
    End Sub
    ---

    Sleepしている間に、ターミナルのキーを押しましたがmy_EndDownload2は呼び出されないのは勿論、MsgBox( "What?" )も実行されません。

    2012年2月11日 13:16
  • 問題の本質が見えづらく、いろいろな可能性が考えられたので、論理的に否定されていなかったことを、「念のため確認しようとした」のですが、いろいろとこじれてしまいましたね、すみません。
    引っ張るのは建設的ではありませんし、必要最小限の指摘・確認にとどめることにします。

    さて、本題ですが、利用側のコードとつきあわせて DLL 側のコードを改めて見直したところ、問題がようやく見えました。SerialPortWriteLn → SerialPortWrite で sp.Close を実行している ので、書き込んだ後に受け取ることはできないのではないかと考えられます。
    少なくとも、Sleep している段階では SerialPort が閉じています。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年2月11日 13:54
    モデレータ
  • 私の真意が分かってもらえて嬉しいです。
     ある同様な趣旨を持つ質問の場で、あるフリーソフトに不具合があるので対策を教えて欲しい旨の質問をしました。そこにて軽薄な文調で浅い知識を披瀝し可能性のある問題点だけを陳述するだけの、平たく言えば質問者を見下しケチをつけるだけ、愚か者が何人もいました。
     軌道を修正するために、角を立てない口調で、別のフリーソフトを紹介して欲しいと依頼すると「私に探せといっているのか」と答えられました。最後にはそんなものは無いと明言してきました。実際には、その後ネット上で自ら検索し、問題の出ていたソフトと同じくらい有名な別のフリーソフトを使用した結果、エラーは出ませんでした。
     無視する方向もあったのですが、この老木でも声を出せねば馬鹿者共を跋扈させ続けさせるだけとの考えに至り、指摘した次第です。
     謝罪があったということは、貴方はそのような下劣な品性を持った人物では*無い*ということです。救われる思いです。


     さて、貴方のご指摘の通り、sp.Close()してしまっていたのが原因でした。実は以前はWrite()する度にOpen()してClose()するプログラムだった(ターミナルソフトを交互に利用する形で共有していたのでVBScript側のみで占有出来なかった)為に、現在の形に変更したときに"Close()"を削除し忘れていました。私の失態です。
     ところで、貴方のご指摘を功を奏して"What"が表示されましたが、その後、

    Microsoft (R) Console Based Script Hose
    問題が発生したため、Microsoft (R) Console Based Script Hoseを終了します...

     なる小さな窓が表示され、それを閉じるとコンソールに次が表示されました。


    ---
    ハンドルされていない例外: System.NotImplementedException: メソッドまたは操作は実
    装されていません。
       場所 System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr
    , Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[
    ] namedParameters)
       場所 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags,
    Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifie
    rs, CultureInfo culture, String[] namedParams)
       場所 System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingF
    lags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
       場所 mytools.ImytoolEvents.EndDownload2(String str)
       場所 mytools.util.SerialPort1_DataReceived(Object sender, SerialDataReceivedE
    ventArgs e)
       場所 System.IO.Ports.SerialPort.CatchReceivedEvents(Object src, SerialDataRec
    eivedEventArgs e)
       場所 System.IO.Ports.SerialStream.EventLoopRunner.CallReceiveEvents(Object st
    ate)
       場所 System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object sta
    te)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
     ContextCallback callback, Object state)
       場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_Th
    readPoolWaitCallback tpWaitCallBack)
       場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object stat
    e)
    ---

    エラーメッセージの解釈は兎も角、util.vbを次の様にして、
    ---
            Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
                MsgBox( "What?" )
                If sp.IsOpen = False Then
                    Return
                End If
    MsgBox( "1" )

                Dim data As String
    MsgBox( "2" )
                data = sp.ReadExisting()
    MsgBox( "3" )
                If Len(data) = 0 Then Exit Sub
    MsgBox( "4" )
                sp.WriteLine("len=" & Len(data))
    MsgBox( "5" )
                RaiseEvent EndDownload2( data )
    MsgBox( "6" )

            End Sub
    ---
    実験すると、"5"まで表示されました。当然ですが、"5"と"6"の間の、VBScript側の

    Sub my_EndDownload2( str )  
        MsgBox "終了イベント:" & str
    End Sub

    は実行されません。

     質問の内容が変わってしまいますが、"5"の後で当該エラーになるのは何故でしょうか。未だ私の失態がありますか?


    • 編集済み 山本春海 2012年2月21日 5:08 不適切発言削除
    2012年2月11日 15:36
  • ハンドルされていない例外: System.NotImplementedException: メソッドまたは操作は実 装されていません。

     VB は範囲外ですが、イベント ハンドル メソッドを自動で生成したとき、中にはこの例外が発生するコードが仕組まれます。Not Implemented、実装されていない、です。皮は自動生成されますが、中身は自分で書かなければなりません。


    Jitta@わんくま同盟

    2012年2月12日 9:40
  • 本題は話が進んでいるようなので…それとは別に気になっていることを。

    COM化することとDLL化することは別です。COMはDLL以外にもEXE形式もあります。またDLLはCOM以外にも形式があります。
    さて、COM化するサイトのURLを提示された上でDLL化できない、という記述を見たらどう感じますか? そもそもDLL化できていないと受け取るのが当然かと思います。

    それから質問する際は、意図通りに動作しない問題となっているコードを提示してください。意図通りに動作しているコードを提示した上で(提示されていない)コードが動作しないと書かれたら、その質問を読んだ人が「提示されたコードが動作しない」のだと誤解するのは当然です。

    もっと謙虚に、質問を読む人の立場になって質問を書いてください。そこには年齢は関係ありません。

    2012年2月12日 13:15
  • >VB は範囲外ですが、イベント ハンドル メソッドを自動で生成
    >したとき、中にはこの例外が発生するコードが仕組まれます。
    >Not Implemented、実装されていない、です。皮は自動生成され
    >ますが、中身は自分で書かなければなりません。
     私の技量不足が原因で、具体策が見えません。中身を書くとは、どうするのですか?
    2012年2月13日 23:38
  • 私もAzuleanさんと同じ疑問を抱いたので、思考過程を説明しておきます。

     内容の一部分だけに固執して無為に時間を費やすい意思はありません。あなたが今回の私に対して生じさせたのと同様な誤解を、他の質問者から受けないように指摘しますが、"GetPortNames"という名前が出たとき、
      自分の知識に無い
     →作った関数なのかクラスライブラリの関数なのか自分は判別できない
     →そうであるから質問者に
      “そもそも、GetPortNames とは何か?”
     と質問する
     という過程に成ったという文言は、私は50歳台のジジイですが、受容できないし私以外の年配者も同様かと思われます。不愉快です。知らないのなら調べればよいし、あなたが私の質問に答える環境にある--つまりVisualStudioのVBを利用できる環境にある--のなら"GetPortNames"をコピー・ペーストしてF1キーを押せば良いだけだと考えます。

    "GetPortNames"という名前が出たとき、

    1. 質問文に含まれていない初出キーワード
    2. 調べた結果、GetPortNamesはクラスライブラリに含まれている
    3. クラスライブラリを呼び出せただけで、質問となっている自作したDLLを呼び出せたのかどうか判断つかない
    4. 「どのようにDLLにしたのですか? どのようにDLLを呼び出しているのですか? 本当に呼び出せているかの確認はしましたか?」に答えていないのでやはり本当にDLLを呼び出せたのか判断つかない

    →「そもそも、(クラスライブラリではなく質問者さんの記述した)GetPortNames とは何ですか?」

    となりました。質問者さんが不愉快になる必要はありません。

    2012年2月14日 1:33
  • こんにちは。

    MSDN フォーラムをご利用のみなさん、いつもご利用ありがとうございます。オペレーターの山本です。

    今後こちらのスレッドの質問が、他の方にも有効な情報となるといいなと思いますので、書き込みは質問内容の本質から離れずにできるだけ簡潔にしていただけるとうれしいです。

    フォーラムのように文字ベースだけのやり取りとなる限られた環境では、相手の立場や条件を想像したり、くみ取ることが難しいことが多くあるかと思います。
    誤解されるような、よくない心象を受けるような言葉づかいや、質問内容から離れたやりとりは特に控えてくださいね。今後部分的に書き込みを削除させていただく場合があります。
    また、残念ながらスレッドのロックやアカウントを停止するといった措置をとらせていただく場合があります。
     http://social.msdn.microsoft.com/Forums/ja-JP/help#197

    恐れ入りますが、何卒ご理解くださいますようお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年2月14日 4:53
  •  C# では、「sp.RecievedData +=」と入力すると、自動的にスケルトン コードを生成できるのですが、VB にはそういう機能はないのですね。

    エラーメッセージの解釈は兎も角、

     う~ん。。。何らかの間違いがあるからエラーになるわけで、エラーと判断した理由を示しているメッセージの解釈を「兎も角」とうっちゃると、解決なんてできないですよ。

     COM がらみで出る NotImplementedException ということで、「com notimplementedexception」をキーに検索してみると、こんなモノが見つかりました。

    Thread._Thread.Invoke メソッドより:

    NotImplementedException
    COM IDispatch インターフェイスを使用した遅延バインディングによるアクセスはサポートされていません。

     ここから、MSDN ライブラリ内を「invoke notimplementedexception」をキーに検索しましたが、あちこちに、この記述があります。例外のスタック トレースを見ればわかるように、invoke 系のメソッドで発生しているので、これの可能性を疑います。と、言いたいところですが、_Type.InvokeMember メソッドには、そういった記述がないんですよねぇ。まぁ、これができないとなると、アン マネージからマネージ呼び出しが全部失敗するような気がする。それとも、メイン スレッド以外からの呼び出しに対応できないのだろうか?
    ただ、_Type.InvokeMember の説明に書いてあることによると、アン マネージからの呼び出しには _Type が使われるようですが、スタック トレースを見ればわかるように、実際には RuntimeType が使われています。RuntimeType は、Type の実装の一つで、これは MSDN ライブラリに記述がありません。この先は、マイクロソフトの有償サポートを利用してください。MSDN ライブラリに記述がないので、ライセンスについている無償のインシデント サポートでは無理です。


    メモ:Raising events from .NET UserControl inside a VB6 MDI form(Interop Forms Toolkit) の、Thursday, October 25, 2007 1:30 AM kevinさんの状況がとても近いような気がする。


    Jitta@わんくま同盟

    • 回答としてマーク 山本春海 2012年2月21日 5:14
    2012年2月15日 11:58
  • こんにちは、AkasakaUeno さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    技術的な内容とは関係のないやり取りが行われていましたので、質問内容に関係のないとされた投稿については削除されております。
    フォーラムのような公の場では、意見や認識の食い違いから本題とは関係のないやり取りが発生してしまう事もありますが、色々な考えをお持ちの方が集まっており仕方ない部分もあると思います。
    他の利用者の方にご配慮いただきながら、MSDN フォーラムをご利用いただければと思います。

    なお、有効な情報を得られているようでしたので、勝手なが私のほうで回答としてマークさせていただきました。
    情報を投稿くださったみなさん、ありがとうございました。

    今後とも MSDN フォーラムをよろしくお願いいたします。
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年2月21日 5:13