嵌入.dlls-C#中的程序集解析
作者:互联网
我有一个.dll试图作为资源嵌入可执行文件中.以下两个问题会有所帮助,但不是完整的帮助:
Embedding assemblies inside another assembly
这似乎不符合书面要求. args.Name不能照原样使用,但是即使已修复,该程序仍会抱怨缺少.dll,表明程序集未正确加载.
Embedding DLLs in a compiled executable
以及以下答案之一的链接:
http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/
但是,我的项目中没有任何形式的“ App.xaml *”文件-我没有使用WPF;我将WinForms用于我的可执行文件(由于可执行文件的性质,更改实际上不是一种选择).
因此,我正在寻找一套完整的说明,以将类库作为资源嵌入到可执行文件中,并从资源中加载.dll,而无需在嵌入式资源外部添加.dll文件.
例如,将一个“ App.xaml”文件简单地添加到WinForms项目中是否可行,或者是否存在我不知道的负面交互作用?
谢谢.
编辑:这是我目前正在使用的:
/// <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 ;
}
}
解决方法:
您需要将代码放入主入口点.像这样:
class Program
{
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static void Main(string[] args)
{
// what was here is the same
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
// the rest of sample code
}
}
您不能只是将App.xaml文件添加到Windows窗体应用程序.
另外,CurrentDomain_AssemblyResolve的示例代码很奇怪,我会先尝试this代码.我还没有测试过,但是它看起来更像我以前使用过的代码.
标签:dll,embedded-resource,c 来源: https://codeday.me/bug/20191201/2079285.html