我有一个用C#
编写的应用程序,它需要VB.NET
中的一些功能(更好的说法是CIL
中有效但C#
中未提供的内容) )。
所以我有一个可执行文件和一个库文件。
问题:
它必须在一个文件中发布,并且可能不会拆分为不同的程序集!
可是:
这是一个WPF
应用程序, ILMerge 将不起作用。
我该怎么办?
是否可以动态生成(高性能)IL?
答案 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);
}
答案 2 :(得分:1)
您可以拥有一个程序集,但可以使用不同语言编译多个模块。您将设置三个项目:
现在,您不能使用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。