[英]Visual Studio 2010 - my Windows Form doesn't show up unless I make a MessageBox.Show() call before or after
我目前正在Visual Studio 2010下用C#制作我的第一個項目。
這里是上下文:
我有第一個DLL,它是用非托管C ++編寫的,並且該DLL使用以下指令導出了一些功能:extern“ C” __declspec(dllexport)
外部Windows .exe將我的功能之一作為入口點:這部分完全起作用,可以。
下一部分是UI部分,在這里我遇到一些棘手的行為,但我不完全確定哪種方法正確,我選擇了正確的方法。
除了第一個DLL,我還有一個Assembly(當前是Windows Form應用程序); 它的目的是彈出一個Windows,並在經典控件(如ListBox / ListView等)中顯示一些內容。
由於我想從非托管代碼(即從本機C ++ DLL)調用托管代碼(將其命名為“ UI_part.exe”),因此我修改了VS2010項目中的生成后命令行,以便向RegAsm注冊程序集.exe以獲得“ UI_part.tlb”。
我的本機C ++代碼在.tlb上執行了一條簡單的“ #import”指令,即可訪問我先前在C#項目中定義的接口。
在這個接口中,我在C#項目的主.cs文件中定義了一個實現了Initialize()函數的類:該函數是應該用來調用顯示Windows窗體的函數,稱為Application.Run。 (myForm);
我的問題是,在這種狀態下,盡管我知道我的函數Initialize由本機C ++代碼很好地調用,但由於有了COM互操作機制,以下任何說明都無法使Form出現在屏幕上:
事實是,如果我添加一個簡單的MessageBox.Show(“ myClass.Initialize()”); 在我之前的Initialize函數中,Form出現了,一切似乎都很正常。
但是我不想撥打一些彈出電話來獲取正常的行為。
好的,終於我找到了解決方案:
我打電話給“ myForm = new();” 和“ Application.Run(myForm);” 在線程中;
但這還不夠:
我還在Windows Form類的構造函數中添加了指令“ this.Show();”。 就在“ InitializeComponent();”之后
它使我的窗體始終顯示而無需彈出任何MessageBox。
但是,我的項目還有另一個問題:
在本機C ++ DLL中,我使用#import UI_part.tlb來訪問我的Assembly定義和實現的接口。
但是,當我處於真實的運行時執行環境下時,即外部exe調用本機C ++ DLL,如果我執行.tlb導入的路徑不再可用(我卸下用於測試的驅動器),則exe崩潰時嘗試訪問我的Assembly功能...
但是,我的Assembly存在於本機C ++ DLL的同一目錄中,但是Windows似乎只搜索原始的導入路徑?
如何做一個安全的部署而不依賴編譯路徑?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.