繁体   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