Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как поздно привязать 32-битные/64-битные библиотеки во время выполнения
У меня есть проблема,похожая на описанную здесь , но немного отличающаяся от нее (загрузка сборок и их зависимостей).
У меня есть C++ DLL для рендеринга 3D, который мы продаем клиентам. Для пользователей .NET мы будем иметь обертку CLR вокруг него. C++ DLL может быть построен как в 32-х, так и в 64-битных версиях, но я думаю, что это означает, что нам нужно иметь две оболочки CLR, так как CLR привязывается к конкретному DLL?
Скажем, теперь у нашего клиента есть приложение .NET, которое может быть либо 32, либо 64-битным, и что это чистое приложение .NET, которое оставляет CLR, чтобы разработать его из одного набора сборок. Вопрос в том, как код приложения может динамически выбирать между нашими 32-битными и 64-битными комбинациями CLR/DLL во время выполнения?
Даже более конкретно, применим ли предлагаемый ответ на вышеупомянутый вопрос и здесь (т. е. создать обработчик ResolveEvent)?
Наконец-то у меня есть ответ на этот вопрос, который, похоже, работает.
Скомпилируйте обе 32 & 64-битные версии-обе управляемые & неуправляемые - в отдельные папки. Затем попросите приложение .NET выбрать во время выполнения, из какого каталога загружать сборки.
Проблема с использованием ResolveEvent заключается в том, что он вызывается только в том случае, если сборки не найдены, поэтому легко случайно получить 32-разрядные версии. Вместо этого используйте второй объект AppDomain, где мы можем изменить свойство ApplicationBase, чтобы указать на нужную папку. Таким образом, вы в конечном итоге с кодом, как:
static void Main(String[] argv)
{
// Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit
// sub-directories.
AppDomainSetup objADS = new AppDomainSetup();
System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
switch (System.IntPtr.Size)
{
case (4): assemblyDir += "\\win32\\";
break;
case (8): assemblyDir += "\\x64\\";
break;
}
objADS.ApplicationBase = assemblyDir;
// We set the PrivateBinPath to the application directory, so that we can still
// load the platform neutral assemblies from the app directory.
objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
AppDomain objAD = AppDomain.CreateDomain("", null, objADS);
if (argv.Length > 0)
objAD.ExecuteAssembly(argv[0]);
else
objAD.ExecuteAssembly("MyApplication.exe");
AppDomain.Unload(objAD);
}
В итоге вы получаете 2 exes - ваше обычное приложение и второе приложение переключения, которое выбирает, какие биты загружать. Обратите внимание - я не могу взять на себя ответственность за детали этого самого. Один из моих коллег догадался об этом, учитывая мой первоначальный указатель. Если и когда он подпишется на StackOverflow, я назначу ему ответ
Мне удалось сделать это около года назад, но я уже не помню всех подробностей. В принципе, вы можете использовать IntPtr.Size, чтобы определить, какой DLL загрузить, а затем выполнить фактический LoadLibrary через p/Invoke. в этот момент у вас есть модуль в памяти, и вы должны быть в состоянии просто p/вызвать функции из него-то же самое имя модуля не должно быть перезагружено снова.
Я думаю, однако, что в моем приложении я на самом деле имел C++ DLL зарегистрировать себя как сервер COM, а затем получить доступ к его функциональности через сгенерированную оболочку .NET-так что я не знаю, тестировал ли я когда-либо p/вызывание напрямую.
Некоторое время назад я столкнулся с подобным сценарием. Инструментарий, который я использовал, плохо работал в 64-разрядной среде,и я не смог найти способ динамического принудительного связывания сборок как 32-разрядных.
Можно заставить ваши сборки работать в 32-разрядном режиме, но это требует исправления заголовка CLR (есть инструмент, который делает это в рамках), и если ваши сборки имеют строгие имена, это не работает.
Боюсь, вам придется создать и опубликовать два набора двоичных файлов для 32-и 64-битных платформ.