none
как внедрить dll ссылку в exe? RRS feed

  • Вопрос

  • как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл?
    Выдает ошибки:

    Ошибка 1 Не удается внедрить типы взаимодействия из сборки "StringParser.dll" из-за отсутствия в ней атрибута "GuidAttribute" StringParser.dll

    Ошибка 2 Внедрение типов взаимодействия из сборки "StringParser.dll" невозможно, поскольку у нее отсутствует атрибут "ImportedFromTypeLibAttribute" или атрибут "PrimaryInteropAssemblyAttribute". StringParser.dll

    Мне для WPF надо

    • Изменено Iostrеam 22 февраля 2012 г. 15:20
    18 февраля 2012 г. 17:29

Ответы

  • > как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл?
     

    добавить dll в виде Embedded Resource.
    например, есть проект Class Library:

    namespace ClassLibrary1
    {
        public class Class1
        {
            public string Test()
            {
                return "hello";
            }
        }
    }
    

    компилируем. получим ClassLibrary1.dll

    создаем проект Windows Forms Application. в него добавим файл ClassLibrary1.dll (внимание: добавляем не в References), при этом в свойствах файла надо указать Build Action: Embedded Resources.

    после этого в рантайме ClassLibrary1.dll можно получить с помощью GetManifestResourceStream

    using System;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                using(var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsFormsApplication4.ClassLibrary1.dll"))
                {
                    var bytes = new byte[s.Length];
                    s.Read(bytes, 0, (int)s.Length);
                    var a = Assembly.Load(bytes);
                    var t = a.GetType("ClassLibrary1.Class1");
                    dynamic o = Activator.CreateInstance(t);
                    var res = o.Test();
                    MessageBox.Show(res);
                }
            }
        }
    }

     
       

    • Предложено в качестве ответа Alexandr Gashper 21 февраля 2012 г. 11:43
    • Отменено предложение в качестве ответа Iostrеam 22 февраля 2012 г. 15:20
    • Помечено в качестве ответа Abolmasov Dmitry 28 февраля 2012 г. 13:45
    21 февраля 2012 г. 9:42
  • Попробуйте ILMerge
    • Предложено в качестве ответа Abolmasov Dmitry 20 февраля 2012 г. 5:46
    • Отменено предложение в качестве ответа Iostrеam 22 февраля 2012 г. 15:20
    • Помечено в качестве ответа Abolmasov Dmitry 28 февраля 2012 г. 13:45
    18 февраля 2012 г. 18:57

Все ответы

  • Попробуйте ILMerge
    • Предложено в качестве ответа Abolmasov Dmitry 20 февраля 2012 г. 5:46
    • Отменено предложение в качестве ответа Iostrеam 22 февраля 2012 г. 15:20
    • Помечено в качестве ответа Abolmasov Dmitry 28 февраля 2012 г. 13:45
    18 февраля 2012 г. 18:57
  • Это будет проще сделать, используя Gilma - GUI for ILMerge Application

    Для связи [mail]

    • Предложено в качестве ответа Alexandr Gashper 20 февраля 2012 г. 15:37
    • Отменено предложение в качестве ответа Alexandr Gashper 21 февраля 2012 г. 11:43
    20 февраля 2012 г. 5:44
  • > как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл?
     

    добавить dll в виде Embedded Resource.
    например, есть проект Class Library:

    namespace ClassLibrary1
    {
        public class Class1
        {
            public string Test()
            {
                return "hello";
            }
        }
    }
    

    компилируем. получим ClassLibrary1.dll

    создаем проект Windows Forms Application. в него добавим файл ClassLibrary1.dll (внимание: добавляем не в References), при этом в свойствах файла надо указать Build Action: Embedded Resources.

    после этого в рантайме ClassLibrary1.dll можно получить с помощью GetManifestResourceStream

    using System;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                using(var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsFormsApplication4.ClassLibrary1.dll"))
                {
                    var bytes = new byte[s.Length];
                    s.Read(bytes, 0, (int)s.Length);
                    var a = Assembly.Load(bytes);
                    var t = a.GetType("ClassLibrary1.Class1");
                    dynamic o = Activator.CreateInstance(t);
                    var res = o.Test();
                    MessageBox.Show(res);
                }
            }
        }
    }

     
       

    • Предложено в качестве ответа Alexandr Gashper 21 февраля 2012 г. 11:43
    • Отменено предложение в качестве ответа Iostrеam 22 февраля 2012 г. 15:20
    • Помечено в качестве ответа Abolmasov Dmitry 28 февраля 2012 г. 13:45
    21 февраля 2012 г. 9:42
  • Уважаемый пользователь,

    Если вас не устраивают предложенные варианты, то напишите пожалуйста чем именно.

    Если варианты решают проблему, то пожалуйста, отметьте сообщения как ответы.

    Спасибо.


    Для связи [mail]

    24 февраля 2012 г. 13:43
  • Спасибо за ссылку, будем иметь ввиду )

    27 февраля 2012 г. 19:32
  • Этому приложению нужен .NET Framework 1.1, что не есть гуд, на мой взгляд...

    27 февраля 2012 г. 20:06
  • > как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл?
     

    добавить dll в виде Embedded Resource.
    например, есть проект Class Library:

    namespace ClassLibrary1
    {
        public class Class1
        {
            public string Test()
            {
                return "hello";
            }
        }
    }

    компилируем. получим ClassLibrary1.dll

    создаем проект Windows Forms Application. в него добавим файл ClassLibrary1.dll (внимание: добавляем не в References), при этом в свойствах файла надо указать Build Action: Embedded Resources.

    после этого в рантайме ClassLibrary1.dll можно получить с помощью GetManifestResourceStream

    using System;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                using(var s = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsFormsApplication4.ClassLibrary1.dll"))
                {
                    var bytes = new byte[s.Length];
                    s.Read(bytes, 0, (int)s.Length);
                    var a = Assembly.Load(bytes);
                    var t = a.GetType("ClassLibrary1.Class1");
                    dynamic o = Activator.CreateInstance(t);
                    var res = o.Test();
                    MessageBox.Show(res);
                }
            }
        }
    }

     
        Ошибка:

    Необработанное исключение типа "System.NullReferenceException" в test.exe

    Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.


    11 июля 2015 г. 10:11