【问题标题】:Merge WPF App with C# and VB.NET code将 WPF 应用程序与 C# 和 VB.NET 代码合并
【发布时间】:2011-12-16 13:08:24
【问题描述】:

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

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

我能做什么?
是否可以即时生成(高性能)IL?

【问题讨论】:

  • VB.NET 有什么功能?
  • @MarkEwer:无法使用 WPF 的 ILMerge。我需要一个 C# 中的异常过滤器,并且我有一些用 VB.NET 编写的东西来提供它。
  • 什么更有意义:动态生成 IL 或放弃异常过滤器并在 C# 中手动编写等效代码?
  • 这有帮助吗(作为异常过滤器的 C# 版本)? stackoverflow.com/questions/791390/…
  • 可能是个愚蠢的问题,但你见过this吗?相关引用 "...我见过在 WPF 中组合 .dll 的方法是简单地将 dll 作为嵌入资源添加到项目中,然后以编程方式将 dll 加载到程序集中..." 会让您拥有一个可执行文件并将两个程序集分开?

标签: c# .net vb.net


【解决方案1】:

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

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

【讨论】:

  • 不知道那里有 WPF 合并工具。谢谢。不过,您知道我如何从 C# 生成 IL 吗?遗憾的是不能使用 C# 重写异常过滤器。
【解决方案2】:

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

【讨论】:

  • 粗糙的要求会导致粗糙的结果。 :)
【解决方案3】:

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

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

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

使用 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 所示。

【讨论】:

  • 似乎我仍然需要可执行文件夹中的模块文件。 C# 与 VB.NET 不同,没有 CIL 异常过滤器,遗憾的是它们不能完全用 C# 重写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2010-10-05
  • 2013-04-18
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
相关资源
最近更新 更多