关于.net:使用C#和VB.NET代码合并WPF应用程序

Merge WPF App with C# and VB.NET code

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

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

我能做什么?是否可以在飞行中生成(执行)IL?


有关将wpf exe和库dll合并在一起的信息,请参见以下问题(以及各种答案):使用wpf将dll合并为单个.exe

请参阅此答案,了解异常过滤器的C版本(可能不适用于您的情况,请保存在此处以备将来参考):比多个catch块更优雅的异常处理?


您可以有一个程序集,但使用不同语言编译的多个模块。您将设置三个项目:

  • VB.NET特定代码项目
  • 代码项目
  • EXE项目

现在,您不能使用Visual Studio来构建它(afaik,但您可能可以处理项目文件/msbuild任务来实现此目的),但您可以使用命令行编译器来创建netmodules。

使用csc.exe(对于c),您将使用/target:module命令行参数,而对于vbc.exe(对于vb.net),您也将使用/target:module命令行参数。

然后,在构建您的exe项目时,您将使用命令行编译器(取决于语言),并使用/addmodule:(假设exe项目使用C语言)或/addmodule:(假设exe项目使用vb.net)指向指定要包含在exe输出程序集中的模块。

您还可以选择将所有内容编译成模块,并使用程序集链接器(al.exe)生成输出程序集。

如果上面的选项不吸引你,那么另一个选项是选择一种语言并使用它。

如果您使用vb.net,那么您将拥有异常过滤器(您指出的是所需的部分,这是一个语言特性,而不是通过框架公开)。

如果您使用C,您没有异常过滤器,但是您可以按照George Duckett的答案模拟它们。


我建议您在构建期间仍然创建两个程序集,但随后将一个程序集作为资源嵌入另一个程序集。通过这种方式,可以调用assembly.load()并加载辅助程序集。

1
2
3
4
5
6
7
using (var stream = Assembly.GetExecutingAssembly().
    GetManifestResourceStream(resourceName))
{
      Byte[] assemblyData = new Byte[stream.Length];
      stream.Read(assemblyData, 0, assemblyData.Length);
      return Assembly.Load(assemblyData);
}

有关详细信息,请参阅http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx。