Member 10525430 Ответов: 1

Использование каталога DLL файлов C#


Привет,

Как я могу использовать конкретную папку dll-файлов в c#.

я пишу этот код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ReportReader
{
    public class AssemblyInfoItem
    {
        public string AssemblyName;
        public string AssemblyFile;
        public Assembly Assembly;
    }
    public class AssemblyResolveHelper
    {
        private List<AssemblyInfoItem> assemblyDomain;
        public AssemblyResolveHelper()
        {
            assemblyDomain = new List<AssemblyInfoItem>();
            assemblyDomain.Add(new AssemblyInfoItem 
            {
                AssemblyName = "FirebirdSql.Data.FirebirdClient, Version=5.9.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c",
                AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\FirebirdSql.Data.FirebirdClient.dll"
            });
            assemblyDomain.Add(new AssemblyInfoItem
            {
                AssemblyName = "DevExpress.Data.v16.2, Version=16.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a",
                AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\DevExpress.Data.v16.2.dll"
            });
            assemblyDomain.Add(new AssemblyInfoItem
            {
                AssemblyName = "DevExpress.Utils.v16.2, Version=16.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a",
                AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\DevExpress.Utils.v16.2.dll"
            });
            assemblyDomain.Add(new AssemblyInfoItem
            {
                AssemblyName = "DevExpress.XtraEditors.v16.2, Version=16.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a",
                AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\DevExpress.XtraEditors.v16.2.dll"
            });
            assemblyDomain.Add(new AssemblyInfoItem
            {
                AssemblyName = "DevExpress.XtraGrid.v16.2, Version=16.2.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a",
                AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\DevExpress.XtraGrid.v16.2.dll"
            });
        }
        public bool Load(bool isMessageShown)
        {
            var result = true;
            foreach (var item in assemblyDomain)
            {
                try
                {
                    var assemblyFile = Assembly.LoadFile(item.AssemblyFile);
                    item.Assembly = assemblyFile;
                }
                catch 
                {
                    result = false;
                }
                if (!result)
                {
                    MessageBox.Show("Kütüphane (DLL) dosyası bulunamadı!" + Environment.NewLine + Environment.NewLine +
                    item.AssemblyName + Environment.NewLine + Environment.NewLine + item.AssemblyFile + Environment.NewLine,
                    "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
                }
            }
            return result;
        }
        public Assembly Resolve(object sender, ResolveEventArgs args)
        {
            var result = (Assembly)null;
            var assemblyItem = assemblyDomain.FirstOrDefault(item => item.AssemblyName == args.Name);
            if (assemblyItem != null)
            {
                result = assemblyItem.Assembly;
            }
            return result;
        }
    }
}


и моя программа.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;

namespace ReportReader
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var assemblyResolve = new AssemblyResolveHelper();
            assemblyResolve.Load(true);
            AppDomain.CurrentDomain.AssemblyResolve += assemblyResolve.Resolve;

            //DevExpress.Data.CurrencyDataController.DisableThreadingProblemsDetection = true;
            Application.Run(new Form1());

        }
    }
}


где я могу ошибиться?

Вы не могли бы мне помочь?

Что я уже пробовал:

ничего особенного
значение определенной папке файлов

[no name]

"можете ли вы мне помочь": да, нет, может быть. Сначала у тебя были бы проблемы.

Member 10525430

проблема заключается в том, когда я запускаю exe-файлы igot error
однако я помещаю dll файлы в каталог отладки программа запускается

OriginalGriff

Какая ошибка? Помните, мы не можем видеть ваш экран...

Member 10525430

моя проблема заключается в том,что когда программа запускается, exe управляет каталогом, который включает dll-файлы, однако exe не использует эти dll files.it отправьте сообщение об ошибке "exe остановлен".Когда я копирую dll файлы в каталог exe он работает нормально

1 Ответов

Рейтинг:
2

RickZeeland

Для построения вашей строки:

AssemblyFile = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Binaries\\FirebirdSql.Data.FirebirdClient.dll"
Я думаю, что вы должны использовать Path.Combine() в противном случае обратная косая черта может отсутствовать.
Попробуйте пройти через свой код и посмотреть, каково значение строки AssemblyFile.


Member 10525430

это не о строке assemblyfile, это сбывается.