嵌入的.dll - 大会在C#中解决(Embedding .dlls - Assembly res

2019-09-17 20:19发布

我有一个.dll我试图嵌入作为一个可执行内的资源。 下面的两个问题是有些帮助的,但不是一个完整的帮助:

嵌入另一个组件内部组件

这似乎并不为写入工作; 该args.Name不能用作编写的,但即使它是固定的,该程序仍抱怨缺少.dll文件,表明该组件未正确加载。

在编译的可执行文件中嵌入的DLL

并在其中一个答案的链接:

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 ;
    }
}

Answer 1:

您需要将代码放在你的主入口点。 事情是这样的:

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是奇怪,我会尝试这第一个代码。 我没有测试它,但它看起来更像是我以前使用的代码。



文章来源: Embedding .dlls - Assembly resolving in C#