从 CLI C++ 应用程序在库中加载 C# WPF 表单
Posted
技术标签:
【中文标题】从 CLI C++ 应用程序在库中加载 C# WPF 表单【英文标题】:Load a C# WPF form inside a library from a CLI C++ application 【发布时间】:2012-04-25 04:15:44 【问题描述】:我有一个用 C# 编写的 dll 文件,它与我用 C++ 编写的应用程序的解决方案相同,其中一些文件设置为在 /cli 标志下编译。我想在我的 C# dll 中加载 WPF 表单并将其显示在 C++ /cli 应用程序中。
我已经将我的 C++ 应用程序配置为显示 WPF 内容,因为我目前正在以编程方式将控件添加到 WPF 表单中,但我无法找到如何在运行时从外部资源加载表单。
【问题讨论】:
您的 C# 程序集是包含 WPF 窗口的 WPF(用户/自定义)控件吗? @gliderkite 是的,没错。在我的 C++ 应用程序中,我有一个调用 STA 托管线程的本机线程。从 STA 托管线程,我想从 WPF 控件库加载表单并显示它。 之所以这样设置,是因为应用程序的某些部分需要本地启动。 如果您将控件引用添加到您的 CLI 项目中,您应该能够访问您的控件,那么您是否尝试过 Show 或 ShowDialog 方法? 发布是一个答案,它有效。我刚刚将命名空间添加到我的项目并使用了以下代码:appHandle->Run(cliLicenseWindow) 其中 cliLicenseWindow 是我的 C# 窗口的名称。 @gliderkite 【参考方案1】:如果您将控件引用添加到您的 CLI 项目,您应该能够访问您的控件;让应用程序句柄使用ApplicationHandle->Run(YourWindow) 方法。
【讨论】:
【参考方案2】:您可以像这样将外部 DLL 加载到您的项目中
Dim assembly As Assembly = Assembly.LoadFile(libraryPath & "filename.dll")
Dim type As Type = assembly.[GetType]("NameSpace.ClassName")
// i'm loading as a form here but can be any control
Dim frm As Form = TryCast(Activator.CreateInstance(type), Form)
最后一点,如果您在加载的表单(上图)中加载一个类或控件,该表单也驻留在同一个程序集中,您还需要先加载它,然后再在表单中调用它
【讨论】:
以上是关于从 CLI C++ 应用程序在库中加载 C# WPF 表单的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Vista x64 的 C# 应用程序中加载 C++ DLL
在托管 DLL 中加载 C++ DLL 时出现 EEFileLoadException
C#未能从程序集“mscorlib, Version=4.0.0.0, Culture=neutral, ……”中加载类型“……”。