合并C#DLL';s转换为.EXE
本文关键字:转换 EXE C#DLL 合并 | 更新日期: 2023-09-27 18:26:00
我知道有很多关于这个主题的回复,但我在这个回复中找到的示例代码不适用于每个.dll
我用了这个例子。
public App()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
}
static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
//We dont' care about System Assemblies and so on...
if (!args.Name.ToLower().StartsWith("wpfcontrol")) return null;
Assembly thisAssembly = Assembly.GetExecutingAssembly();
//Get the Name of the AssemblyFile
var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
//Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
if (resources.Count() > 0)
{
var resourceName = resources.First();
using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
{
if (stream == null) return null;
var block = new byte[stream.Length];
stream.Read(block, 0, block.Length);
return Assembly.Load(block);
}
}
return null;
}
当我创建一个只有一个窗口和一个按钮的小程序时,它确实有效,但我的";"大";dll,它不起作用。";"大";dll和我的小程序中的一样。
我无法想象为什么它有时有效,有时无效。我也用ICSharp.AvalonEdit.dll测试过,没有成功。。
有人能想象错误在哪里吗?
编辑1
当我启动程序时,它说找不到我的dll。
编辑2
我想我明白了问题的核心。如果我要合并的某个dll包含对其他dll的引用,则我将成为此FileNotFoundException
异常。有人知道如何加载/添加内部所需的dll的吗
编辑3
当我使用JiříPolášek的代码时,它对一些人有效。My Fluent显示错误";请附上带有样式的资源字典。但我已经在我的App.xaml
中做到了这一点
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Office2010/Silver.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
如果您引用的程序集需要其他程序集,则必须将它们也包含在应用程序中,无论是在应用程序文件夹中还是作为嵌入资源。您可以使用Visual Studio、IL Spy、dotPeek确定引用的程序集,也可以使用方法Assembly.GetReferencedAssemblies
编写自己的工具。
也有可能在将ResolveAssembly
处理程序附加到AssemblyResolve
事件之前触发它。附加处理程序应该是在Main方法中执行的第一件事。在WPF中,您必须使用新的Main方法创建新的类,并在项目设置中将其设置为启动对象。
public class Program
{
[STAThreadAttribute]
public static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve
+= new ResolveEventHandler(ResolveAssembly);
WpfApplication1.App app = new WpfApplication1.App();
app.InitializeComponent();
app.Run();
}
public static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
// check condition on the top of your original implementation
}
}
您还应该检查ResolveAssembly
顶部的保护条件,以不排除任何引用的程序集。