"3.95.131.208 - 3.95.131.208"

Вложение .dlls - Разрешение сборки в С#

У меня есть .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 ;
    }
}
+3
источник поделиться
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 является странным, я сначала попробую этот код. Я не тестировал его, но он больше похож на код, который я использовал раньше.

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос