合并WPF应用程序与c#和VB.NET代码
本文关键字:VB NET 代码 WPF 应用程序 合并 | 更新日期: 2023-09-27 18:12:38
我有一个应用程序,用C#
编写,需要VB.NET
的一些功能(更好地说,在CIL
中有效,但在C#
中未提供)。
所以我有一个可执行文件和一个库文件。
问题:
它必须在一个文件中发布,并且不能拆分到不同的程序集!
但:
这是一个WPF
应用程序,ILMerge将不起作用。
我该怎么办?
是否有可能在飞行中生成(高性能)IL ?
有关合并WPF exe和库dll的问题(以及各种答案):
使用wpf
请参阅以下答案,以获取c#版本的异常过滤器(可能不适用于您的情况,保留在这里以供将来参考):
比多个Catch块更优雅的异常处理?
你可以有一个汇编,但有多个模块用不同的语言编译。您将设置三个项目:
- VB。. net专用代码项目 c#代码项目
- EXE项目
现在,你不能使用Visual Studio来构建这个(当然,你可以修改项目文件/MSBUILD任务来完成这个),但是你可以使用命令行编译器来创建netmodules。
使用csc.exe (c#),您将使用/target:module
命令行参数,而使用vbc.exe (VB.NET),您还将使用/target:module
命令行参数。
然后,在构建您的EXE项目时,您将使用命令行编译器(取决于语言)并使用/addmodule:<module>
(假设EXE项目在c#中)或/addmodule:<module>
(假设EXE项目在VB.NET中)指向您指定要包含在EXE输出程序集中的模块。
您还可以选择将所有内容编译为模块,并使用汇编链接器(Al.exe)生成输出程序集。
如果上面的选择对你没有吸引力,那么另一个选择是选择一种语言并使用它。
如果您使用VB。. NET,那么您将拥有异常过滤器(您指出的是您需要的部分,这是一个语言特性,不通过框架公开)。
如果你使用c#,你没有异常过滤器,但是你可以模仿它们,正如George Duckett的回答所示。
我建议您在构建期间仍然创建两个程序集,但然后将其中一个作为资源嵌入到另一个中。这样,您就可以调用assembly. load()并加载该辅助程序集。
using (var stream = Assembly.GetExecutingAssembly().
GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}