Я разрабатываю приложение, которое ссылается на сторонние сборки определенного поставщика и использует их; в поле разработки у меня есть эти 3 сборки в ссылочной папке в моем дереве исходного кода, и я могу ссылаться на них и собирать приложение, приложение собирается, но не запускается, потому что все серверное приложение не установлено, но это нормально.
На сервере, где я хочу скопировать это специальное приложение и запустить все сборки, на которые я ссылаюсь, находятся в папке примерно такого типа:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
и если я скопирую свой небольшой исполняемый файл в эту папку и запущу его, он будет работать отлично, но если я помещу свой .exe в более подходящую папку, как мне нужно:< /p>
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
он не работает, поскольку не может разрешить эти сборки.
Я знаю, что могу использовать зондирование в приложении. config, чтобы указать, в каких папках мой exe должен искать ссылки, но в моем случае сборки находятся не в подпапке, а в совершенно другом месте.
Я этого не делаю. хочу скопировать все сборки поставщика в папку моего приложения, и я не могу поместить туда только те 3, на которые ссылаюсь, потому что они также загружают другие сборки, и если у меня нет их всех (многих...), это не работает.
Я не делаю ничего особенного, не создаю домены приложений и не загружаю сборки посредством отражения, просто хочу, чтобы CLR разрешала ссылки по мере необходимости при запуске или выполнении приложения.< /p>
Спасибо.
Изменить: вот окончательный рабочий код
static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();
try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];
Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
AssemblyName myAssemblyName = Array.Find(arrReferencedAssmbNames, a => a.Name == args.Name);
if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly to load: {0} - File was found in: {1}", args.Name, strTempAssmbPath);
// Loads the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
}
}
}
// Returns the loaded assembly.
return MyAssembly;
}
catch (Exception exc)
{
logger.Error(exc);
return null;
}
}
Подробнее здесь: https://stackoverflow.com/questions/526 ... her-folder
Разрешение ссылок на сборки из другой папки ⇐ C#
Место общения программистов C#
-
Anonymous
1713271736
Anonymous
Я разрабатываю приложение, которое ссылается на сторонние сборки определенного поставщика и использует их; в поле разработки у меня есть эти 3 сборки в ссылочной папке в моем дереве исходного кода, и я могу ссылаться на них и собирать приложение, приложение собирается, но не запускается, потому что все серверное приложение не установлено, но это нормально.
На сервере, где я хочу скопировать это специальное приложение и запустить все сборки, на которые я ссылаюсь, находятся в папке примерно такого типа:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
и если я скопирую свой небольшой исполняемый файл в эту папку и запущу его, он будет работать отлично, но если я помещу свой .exe в более подходящую папку, как мне нужно:< /p>
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
он не работает, поскольку не может разрешить эти сборки.
Я знаю, что могу использовать зондирование в приложении. config, чтобы указать, в каких папках мой exe должен искать ссылки, но в моем случае сборки находятся не в подпапке, а в совершенно другом месте.
Я этого не делаю. хочу скопировать все сборки поставщика в папку моего приложения, и я не могу поместить туда только те 3, на которые ссылаюсь, потому что они также загружают другие сборки, и если у меня нет их всех (многих...), это не работает.
Я не делаю ничего особенного, не создаю домены приложений и не загружаю сборки посредством отражения, просто хочу, чтобы CLR разрешала ссылки по мере необходимости при запуске или выполнении приложения.< /p>
Спасибо.
[b]Изменить: вот окончательный рабочий код[/b]
static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();
try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];
Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
AssemblyName myAssemblyName = Array.Find(arrReferencedAssmbNames, a => a.Name == args.Name);
if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");
if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly to load: {0} - File was found in: {1}", args.Name, strTempAssmbPath);
// Loads the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
}
}
}
// Returns the loaded assembly.
return MyAssembly;
}
catch (Exception exc)
{
logger.Error(exc);
return null;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/5260404/resolve-assembly-references-from-another-folder[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия