none
[問題]有關Labview的dll檔如何讓Visual basic2008使用 RRS feed

  • 問題

  • 各位版大您們好

    小弟我在Labview寫了一個程式並轉成dll檔,想給VB2008當成副程式使用,但是想納該DLL檔時

    發生了以下錯誤,上網找了一些相關Q&A之後還是沒辦法得到解答,想在此詢問比較有經驗的版友.

    在此感謝!(至於labview runtime engine 8.5已經安裝完成,但還是有以下錯誤)



    • 已編輯 Ace_Wang 2013年4月3日 上午 06:11
    2013年4月3日 上午 06:08

解答

  • Labview 我是沒用過, 不過它做出來的應該不是 .Net DLL 吧 ?

    根據 Labview:VB.NET to Call Labivew DLLS

    它應該是用 P/Invoke 方式呼叫


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年4月3日 上午 06:16
    版主
  • 这个是线程问题——因为改变TextBox不是主线程,而且这个错误只在调试时候发生,运行时不会的,对不?

    解决方法(取消上面你标记的那个答案,以这个为准):

    Public Class Form1
        Private Sub LongTask()
            '模擬一個容易死機的程序耗時長……
            Threading.Thread.Sleep(10000)
        End Sub
     
        Private Sub BeginInvokeMethod(ic As IAsyncResult)
            If (InvokeRequiredThen
                Invoke(New action(AddressOf CompleteTask))
            Else
                Label1.Text = "不是异步完成啦"
            End If
        End Sub
     
        Private Sub Form1_Load(sender As Objecte As EventArgsHandles MyBase.Load
     
        End Sub
     
        Private Sub Button1_Click(sender As Objecte As EventArgsHandles Button1.Click
            Dim act As New Action(AddressOf LongTask)
            '開始異步獲取結果
            act.BeginInvoke(AddressOf BeginInvokeMethodNothing)
        End Sub
     
        Private Sub CompleteTask()
            Label1.Text = "异步完成啦"
        End Sub
     
    End Class


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    • 已編輯 ThankfulHeart 2013年4月12日 上午 08:27
    • 已標示為解答 Ace_Wang 2013年4月12日 上午 08:45
    2013年4月12日 上午 08:26
  • 右鍵你的Solution中的那個Project,然後選擇“屬性”,調整版本號即可。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    • 已標示為解答 Ace_Wang 2013年4月17日 上午 09:47
    2013年4月17日 上午 09:39
  • HOW TO:變更目標 .NET Framework

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Ace_Wang 2013年4月17日 上午 09:47
    2013年4月17日 上午 09:43
    版主

所有回覆

  • Labview 我是沒用過, 不過它做出來的應該不是 .Net DLL 吧 ?

    根據 Labview:VB.NET to Call Labivew DLLS

    它應該是用 P/Invoke 方式呼叫


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年4月3日 上午 06:16
    版主
  • 好! 我先試試看!

    感謝回覆!

    2013年4月3日 上午 06:22
  • http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/181fa1b7-a1f9-458e-8cda-f248019c02b1

    各位版大:

    不好意思,上面那個連結是我之前問的問題,熱心的Bill版主有幫我回答一些相關回答,裡面有個連結如下,

    http://iammic.pixnet.net/blog/post/37348863-labview%EF%BC%9Avb.net-to-call-labivew-dlls

    目前Labview的dll檔案已經包好,但是我照這個網址做到第十步時就卡住>>SETP 10.將 Labivew DLL 放置到 VB.NET 產生 .EXE 檔案目錄下

    ,我不知道該資料夾的正確位置,GOOGLE後無功而返,再根據Bill版主所說的:"它應該是用 P/Invoke 方式呼叫",此方法不知道可不可以更詳細以協

    助我解決此問題,不曉得還可否進一步知道更直接的答案,再此感謝之前的回覆!

    2013年4月10日 上午 06:43
  • 默认生成的EXE位置在"项目文件夹\bin\Debug或者Release“下。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    • 已標示為解答 Ace_Wang 2013年4月10日 上午 07:20
    2013年4月10日 上午 06:46
  • How Do I Use a LabVIEW DLL in Microsoft Visual Studio.NET?

    http://digital.ni.com/public.nsf/allkb/FA5837624BE5300B86256CBA00096E8C

    • 已標示為解答 Ace_Wang 2013年4月10日 上午 07:20
    2013年4月10日 上午 07:00
  • 那為什麼不接續在那篇繼續討論?
    2013年4月10日 下午 12:28
  • 那為什麼不接續在那篇繼續討論?

    嗯嗯,不好意思,下次會改進!
    2013年4月11日 上午 09:08
  • Dear all

         sorry想繼續提問問題,這次可以順利讀到labview的dll檔案,這個dll檔案是個燒錄IC的程式,我讓使用者丟

    一個值進去啟動燒錄程式,回傳一個值可代表燒錄是否成功,但是該dll檔在Labview所執行的時間大約10秒鐘才能

    跑完,由VB來執行的時候就會發生"沒有回應"的狀況,當時我找到這個網站的解法,但似乎沒用

    http://www.programmer-club.com/ShowSameTitleN/csharp/10583.html

    以下是我程式的執行時發生的問題的圖片

    http://i.imgur.com/HyrUR7C.png

    2013年4月12日 上午 05:50
  • 或许你考虑应该使用异步使得主线程不被阻塞。

    譬如:

    1)定义一个委托(比如Action)。

    2)调用其异步(BeginInvoke方法)。

    3)示例代码:

     
    Public Class Form1
        Private Sub LongTask()
            '模擬一個容易死機的程序耗時長……
            Threading.Thread.Sleep(10000)
        End Sub
     
        Private Sub BeginInvokeMethod(ic As IAsyncResult)
            Label1.Text = "完成啦!"
        End Sub
     
        Private Sub Form1_Load(sender As Objecte As EventArgsHandles MyBase.Load
     
        End Sub
     
        Private Sub Button1_Click(sender As Objecte As EventArgsHandles Button1.Click
            Dim act As New Action(AddressOf LongTask)
            '開始異步獲取結果
            act.BeginInvoke(AddressOf BeginInvokeMethodNothing)
        End Sub
    End Class
    

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    • 已標示為解答 Ace_Wang 2013年4月12日 上午 07:07
    • 已取消標示為解答 Ace_Wang 2013年4月12日 上午 07:11
    • 已編輯 ThankfulHeart 2013年4月12日 上午 07:51
    • 已標示為解答 Ace_Wang 2013年4月12日 上午 08:16
    2013年4月12日 上午 05:52
  • 感謝回覆

    我先試試看,如果成功會標記為解答!

    2013年4月12日 上午 07:19
  • OK,有问题继续

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月12日 上午 07:25
  • 不好意思,繼續剛剛的問題,其實我剛剛一直在學會怎麼用action這東西

    可是還是沒辦法除掉一些語法上的錯誤,不曉得可否直接指導,以下為目前程式所出現的錯誤

    http://i.imgur.com/MrB5Qrb.png

    2013年4月12日 上午 07:46
  • 哦,你是用2008的……嗯,那么我改成2008的样子(上面代码已经更改了)。谢谢!


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月12日 上午 07:51
  • 哦,你是用2008的……嗯,那么我改成2008的样子(上面代码已经更改了)。谢谢!


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    我馬上著手修改,感謝回覆!
    2013年4月12日 上午 07:53
  • 應該是沒問題了,接下來錯誤的東西應該是VB的語法錯誤,剛標記你為答案了

    真的很感謝!(目前的錯誤)

    http://i.imgur.com/JgvD6wM.png

    2013年4月12日 上午 08:19
  • 这个是线程问题——因为改变TextBox不是主线程,而且这个错误只在调试时候发生,运行时不会的,对不?

    解决方法(取消上面你标记的那个答案,以这个为准):

    Public Class Form1
        Private Sub LongTask()
            '模擬一個容易死機的程序耗時長……
            Threading.Thread.Sleep(10000)
        End Sub
     
        Private Sub BeginInvokeMethod(ic As IAsyncResult)
            If (InvokeRequiredThen
                Invoke(New action(AddressOf CompleteTask))
            Else
                Label1.Text = "不是异步完成啦"
            End If
        End Sub
     
        Private Sub Form1_Load(sender As Objecte As EventArgsHandles MyBase.Load
     
        End Sub
     
        Private Sub Button1_Click(sender As Objecte As EventArgsHandles Button1.Click
            Dim act As New Action(AddressOf LongTask)
            '開始異步獲取結果
            act.BeginInvoke(AddressOf BeginInvokeMethodNothing)
        End Sub
     
        Private Sub CompleteTask()
            Label1.Text = "异步完成啦"
        End Sub
     
    End Class


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    • 已編輯 ThankfulHeart 2013年4月12日 上午 08:27
    • 已標示為解答 Ace_Wang 2013年4月12日 上午 08:45
    2013年4月12日 上午 08:26
  • 確實一開始用.exe來執行是不會報錯,目前我已經用你的程式修改了!

    感謝這位高手耐心的回覆!

    2013年4月12日 上午 08:47
  • 各位板大不好意思,承上面的討論,我自己有另開一個空白的程式碼並寫入上面的程式,不會發生問題(如圖

    http://i.imgur.com/4oZrCF8.png

    但是移到我們想要的程式卻出現system.action(OF t)型別引數太少的錯誤(如下圖),請問這情況該如何解決呢

    http://i.imgur.com/GlfP7SQ.png

    2013年4月17日 上午 08:48
  • 確認你已經正確使用了net framework3.5,並且引用了命名空間(System):

    在一開始:Imports System

    http://msdn.microsoft.com/zh-tw/library/018hxwa8.aspx


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月17日 上午 08:52
  • 應該是發生問題的那個使用的 .Net Framework 是 2.0 或 3.0 吧 ?

    之前版本只有 Action 泛型委派.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年4月17日 上午 08:58
    版主
  • 感謝兩位高手回覆

    第二張圖確實是原本從VB2005轉VB2008的程式碼,第一張圖則是2008開始寫的程式碼

    我已經imports system了,沒有作用,那假如原本vb2005轉2008的程式要加入該程式碼的話

    是否要修改什麼指令還是哪邊可以調整framework的版本呢?


    • 已編輯 Ace_Wang 2013年4月17日 上午 09:38
    2013年4月17日 上午 09:37
  • 右鍵你的Solution中的那個Project,然後選擇“屬性”,調整版本號即可。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    • 已標示為解答 Ace_Wang 2013年4月17日 上午 09:47
    2013年4月17日 上午 09:39
  • HOW TO:變更目標 .NET Framework

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 Ace_Wang 2013年4月17日 上午 09:47
    2013年4月17日 上午 09:43
    版主