2015-10-06 1 views
4

У меня проблема с сборками .Net, которые не обнаруживаются при попытке загрузить их из 64-битного процесса, если пользователь, загружающий сборки, не имеет достаточных прав доступа ,. Сбор сборных данных из UNC-пути завершается с ошибкой без прав на изменение на 64-разрядном

Загрузка одних и тех же сборок из 32-битного процесса не является проблемой, и если пользователю, выполняющему 64-битный процесс, даются права на изменение, загрузка не является проблемой.

Файлы DLL находятся в общем доступе к файлу (я предполагаю, что это NTFS, но не совсем уверен) и загрузка с UNC-пути.

DLL не загружается в обычную. Net-программу, а используется в Python через Python.Net и в Matlab через стандартную интеграцию Matlab .Net. Проблема такая же в Python и Matlab, поэтому предположим, что проблема находится на стороне .Net.

+0

Вам необходимо разместить свои версии ОС OS/Python/.NET и битту. Возможно, вы можете найти эквивалентные сборки .NET с открытым исходным кодом, чтобы воспроизвести проблему здесь на SO. – denfromufa

ответ

4

Существует версия AppDomain.CurrentDomain.Load(), которая принимает byte[], содержащий содержимое файла для загрузки DLL. С помощью этого вы можете вручную загрузить довольно хорошо любой сборки .NET, что вы можете получить доступ, будь то на локальном диске, сеть, сжатый, ресурс, загрузки и т.д.

В C# вы можете использовать что-то вроде этого:

public static Assembly LoadAssembly(string filename) 
{ 
    var content = System.IO.File.ReadAllBytes(filename); 
    return AppDomain.CurrentDomain.Load(content); 
} 

Даже не пытаюсь перевести это на Python.NET или Matlab.

Поскольку чтение файла напрямую не связано с сборкой, оно не вызывает проблем безопасности при загрузке удаленной сборки. Также имеет дополнительное преимущество, что DLL-файл никогда не блокируется дольше, чем требуется, чтобы полностью прочитать его в памяти. Однако требуется немного больше памяти.

+0

Возможно, это будет слишком низкий уровень для Python.NET и определенно не будет работать на Matlab. Досадно, что он работает на 32 бит, и он также работает на 64 бит, если файлы находятся на локальном диске или права доступа включают права на изменение. – oyse

+0

@oyse Похоже, вы можете получить доступ к «AppDomain» из Matlab. Вы не можете назвать «ReadAllBytes» или что-то еще? – Corey

Смежные вопросы