Загрузите dll с общего сетевого диска в С#

Я могу загрузить dll, используя эту форму -

System.Reflection.Assembly assembly =
System.Reflection.Assembly.LoadFile(@"C:\Users\amit.pandey\Documents\Visual Studio 2010\Projects\bin\Release\EUtility.dll");

Однако мне нужно загрузить dll с общего сетевого диска следующим образом:

System.Reflection.Assembly assembly =
System.Reflection.Assembly.LoadFile(@"\\falmumapp20\EUtility.dll");

Я знаю, что это вызвано из-за проблемы с доверием. Я пробовал различные доступные коды, но не мог заставить его работать. Может кто-нибудь помочь мне с примером кода для загрузки dll с сетевого диска?

Я хочу сделать это в самом коде, не внося изменений в какой-либо файл конфигурации.


person Amit Pandey    schedule 27.11.2012    source источник
comment
Какая у вас версия .NET? Какое именно исключение/ошибку вы получаете?   -  person Dirk Vollmar    schedule 27.11.2012
comment
Я использую .Net 4.0, ошибка, которую я получаю, заключается в том, что та же самая dll загружается с моего локального компьютера, но когда я пытаюсь загрузить ее с удаленного компьютера, она терпит неудачу и говорит о проблеме с доверенным доменом.   -  person Amit Pandey    schedule 27.11.2012
comment
Убедитесь, что вы можете получить доступ к общему ресурсу, на котором вы храните dll. На работе мне всегда приходится повторно подключаться к эталонным ресурсам каждый раз, когда я выключаю машину, потому что она теряет соединение и не позволяет использовать dll.   -  person wjhguitarman    schedule 27.11.2012


Ответы (3)


В качестве альтернативы загрузка файла с диска и вызов Assembly.Load в массиве байтов, похоже, работают (Framework 4):

        string Share = @"R:\Test\TestAssembly.dll";
        byte[] AssmBytes = File.ReadAllBytes(Share);
        Assembly a = Assembly.Load(AssmBytes);

        //Invoking a method from the loaded assembly
        var obj = a.CreateInstance("TestAssembly.Class1");
        obj.GetType().InvokeMember("HelloWorld", BindingFlags.InvokeMethod, null, obj, null);

Поскольку MS блокирует сетевую загрузку в LoadFrom(), это может указывать на то, что это, вероятно, не лучшая практика. Однако это похоже на процесс, который часто используется при внедрении сборок в качестве ресурсов в EXE.

person transistor1    schedule 21.09.2013

Вам нужно сказать машине доверять этому местоположению.

Это можно сделать с помощью утилиты caspol.

person hometoast    schedule 27.11.2012
comment
ВАЖНО: В .NET Framework версии 4 и более поздних версиях Caspol.exe не влияет на политику CAS, если для элемента ‹legacyCasPolicy› не задано значение true. Дополнительные сведения см. в разделе Изменения безопасности в .NET Framework 4. См. msdn.microsoft.com/en-us/library/cb6t8dtz%28v=vs.100%29.aspx - person Dirk Vollmar; 27.11.2012
comment
Спасибо за этот отказ от ответственности. (последний раз, когда у меня была проблема с надежным местоположением, была версия 2.0) - person hometoast; 27.11.2012
comment
это верно, и ответ приемлем, но что, если мне не нужно использовать утилиту caspol, а делать это внутри самого кода. Проблема в том, что мы должны доставить его клиенту, и мы хотели бы, чтобы код позаботился о загрузке, а не об обслуживании/модификации на стороне клиента. - person Amit Pandey; 28.11.2012
comment
Думаю, это то, с чем вам придется столкнуться при установке вашего приложения. - person hometoast; 28.11.2012
comment
Что делать, если я не могу изменить код? Можно ли еще как-то заставить программу доверять акции? В моем случае я запускаю программу из сети только с хостом VirtualBox, поэтому я хотел бы, чтобы Windows полностью доверяла общему ресурсу. - person Arne; 18.09.2017

Вместо загрузки двоичного содержимого вы можете использовать Assembly.UnsafeLoadFrom. См. http://msdn.microsoft.com/en-us/library/system.reflection.assembly.unsafeloadfrom%28v=vs.110%29.aspx

Это работало нормально для меня во всех целях.

person David Gausmann    schedule 10.10.2014