Загрузить DLL в VB.NET на основе версии приложенияC#

Место общения программистов C#
Ответить
Anonymous
 Загрузить DLL в VB.NET на основе версии приложения

Сообщение Anonymous »

В настоящее время я разрабатываю приложение .net для структур Tekla (программное обеспечение CAD). Tekla Structures выпускает новую версию ежегодно (например, 2020, 2021, 2022, 2023 и т. Д.), И каждая версия поставляется с набором определенных файлов DLL, таких как TeklaStructures.dll и Tekla.structures.Model.dll, наряду с их зависимостью. Хотя эти DLL имеют одинаковые имена и, по большей части, одни и те же классы и методы (около 99% совместимости), они являются специфичными для версии. < /P>
Задача возникает потому, что наша организация работает Как по старым, так и в более новых проектах, требуя поддержки нескольких версий Tekla Structures. Моя цель состоит в том, чтобы создать приложение, которое может динамически работать со всеми версиями структур Tekla без перекомпиляции для каждой версии. Например, DLLS из Tekla Structures 2023 будет работать только со структурами Tekla 2023, а не с более ранними версиями. Заводящая версия Tekla Structures. Однако, поскольку я ссылался на DLL непосредственно в своем проекте, Visual Studio автоматически извлекает недостающие DLL из глобального кэша сборки (GAC). < /P>

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Dummy;

namespace TestDummyDLL
{
public partial class Form1 : Form
{
public Form1()
{

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveMissingDll);
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
var dummy = new Dummy.Dummy();
dummy.Print();
}

private static Assembly ResolveMissingDll(object sender, ResolveEventArgs args)
{
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

string TeklaVersion = "2023"; // Tekla version will be retrieved by looking up running process.
string dllsFolder = Path.Combine(baseDirectory, TeklaVersion);

string assemblyName = new AssemblyName(args.Name).Name + ".dll";
string assemblyPath = Path.Combine(dllsFolder, assemblyName);

if (File.Exists(assemblyPath))
{
return Assembly.LoadFrom(assemblyPath);
}

return null;
}

}
}
content. , но, к сожалению, это не решается, потому что ссылка, которую я добавил (для использования методов) рассматривается как первичная и используется вместо этого. < /p> Установите скопируйте локальный в false:
< /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... on-version
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»