合并WPF应用程序与c#和VB.NET代码

本文关键字:VB NET 代码 WPF 应用程序 合并 | 更新日期: 2023-09-27 18:12:38

我有一个应用程序,用C#编写,需要VB.NET 的一些功能(更好地说,在CIL中有效,但在C#中未提供)
所以我有一个可执行文件和一个库文件。

问题:
它必须在一个文件中发布,并且不能拆分到不同的程序集!
但:
这是一个WPF应用程序,ILMerge将不起作用。

我该怎么办?
是否有可能在飞行中生成(高性能)IL ?

合并WPF应用程序与c#和VB.NET代码

有关合并WPF exe和库dll的问题(以及各种答案):
使用wpf

将dll合并到一个.exe文件中

请参阅以下答案,以获取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);
}