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

时间:2011-10-27 13:56:36

标签: c# .net vb.net

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

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

我该怎么办?
是否可以动态生成(高性能)IL?

3 个答案:

答案 0 :(得分:2)

请参阅此问题(以及各种答案),以便将WPF exe和库dll合并在一起:
Merging dlls into a single .exe with wpf

请参阅此答案,了解异常过滤器的C#版本(可能不适用于您的情况,保留在此处以供将来参考):
More Elegant Exception Handling Than Multiple Catch Blocks?

答案 1 :(得分:1)

我建议您在构建期间仍然创建两个程序集,然后将一个程序集作为资源嵌入到另一个程序集中。这样,您可以调用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);
}

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

答案 2 :(得分:1)

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

  • VB.NET特定的代码项目
  • C#代码项目
  • EXE项目

现在,您不能使用Visual Studio来构建它(AFAIK,但您可能能够使用项目文件/ MSBUILD任务来完成此操作),但您可以使用命令行编译器来创建netmodules。

使用csc.exe(对于C#),您将使用/target:module命令行参数,而对于vbc.exe(对于VB.NET),您还将使用/target:module命令行参数

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

您还可以选择将所有内容编译到模块中,并使用Assembly Linker (Al.exe) to produce an output assembly

如果上述选项不适合您,则另一种选择是选择一种语言并使用它。

如果您使用VB.NET,那么您将拥有异常过滤器(您指出的是您需要的部分,这是一种语言功能,不通过框架公开)。

如果您使用C#,则没有例外过滤器,但您可以emulate them指示George Duckett's answer