我有一个.dll文件,想将其作为资源嵌入到可执行文件中。以下两个问题在一定程度上有所帮助,但并不完全解决问题:
将程序集嵌入到另一个程序集中
这似乎无法按照原文使用args.Name,即使修复后,程序仍然报告缺少.dll文件的错误,表明程序集未正确加载。
在编译后的可执行文件中嵌入DLL
以及其中一个答案中的链接:
http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/
然而,我的项目中没有任何类型的“App.xaml*”文件 - 我不使用WPF;我正在使用WinForms来制作可执行文件(由于可执行文件的性质,更改并不是一个选项),因此我正在寻找一组完整的说明,以将类库嵌入可执行文件作为资源,并从资源加载该.dll,而无需在嵌入式资源之外需要.dll文件。例如,是否实际上可以向WinForms项目添加“App.xaml”文件,或者是否存在我不知道的负面交互作用?谢谢。编辑:这是我目前正在使用的内容:/// <summary>
/// Stores the very few things that need to be global.
/// </summary>
static class AssemblyResolver
{
/// <summary>
/// Call in the static constructor of the startup class.
/// </summary>
public static void Initialize( )
{
AppDomain.CurrentDomain.AssemblyResolve +=
new ResolveEventHandler( Resolver ) ;
}
/// <summary>
/// Use this to resolve assemblies.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
public static Assembly Resolver( object sender, ResolveEventArgs args )
{
Assembly executingAssembly = Assembly.GetExecutingAssembly( ) ;
if ( args.Name == null )
throw new NullReferenceException(
"Item name is null and could not be resolved."
) ;
if ( !executingAssembly.GetManifestResourceNames().Contains(
"Many_Objects_Display.Resources." +
new AssemblyName( args.Name ).Name.Replace( ".resources", ".dll" ) )
)
throw new ArgumentException( "Resource name does not exist." ) ;
Stream resourceStream =
executingAssembly.GetManifestResourceStream(
"Many_Objects_Display.Resources." +
new AssemblyName( args.Name ).Name.Replace( ".resources", ".dll" )
) ;
if ( resourceStream == null )
throw new NullReferenceException( "Resource stream is null." ) ;
if ( resourceStream.Length > 104857600)
throw new ArgumentException(
"Exceedingly long resource - greater than 100 MB. Aborting..."
) ;
byte[] block = new byte[ resourceStream.Length ] ;
resourceStream.Read( block, 0, block.Length ) ;
Assembly resourceAssembly = Assembly.Load( block ) ;
if ( resourceAssembly == null )
throw new NullReferenceException( "Assembly is a null value." ) ;
return resourceAssembly ;
}
}
AssemblyResolve
事件即可。 - Mike Zboray