从 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# 中从文件中加载 RSA 公钥

使用 AS 2 将影片剪辑从库中加载到舞台

C#未能从程序集“mscorlib, Version=4.0.0.0, Culture=neutral, ……”中加载类型“……”。

避免在 C++/CLI 项目中加载 .Net Dlls?