簡體   English   中英

Visual Studio 2010-我的Windows窗體不會顯示,除非我在之前或之后進行MessageBox.Show()調用

[英]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出現在屏幕上:

  • Application.Run(myForm);
  • myForm.ShowDialog();
  • myForm.Show();

事實是,如果我添加一個簡單的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM