在C#中从共享网络驱动器加载dll

5
我能够使用以下方式加载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吗?

我想在代码中自己实现,而不需要对任何配置文件进行更改。


你使用的是哪个.NET版本?你遇到的确切异常/错误是什么? - Dirk Vollmar
我正在使用 .Net 4.0,遇到的错误是同一个 dll 在我的本地计算机上可以加载,但当我尝试从远程计算机加载它时,会失败并显示受信任域问题。 - Amit Pandey
确保您可以访问存储dll的共享文件夹。在工作中,每当我关闭计算机时,都必须重新连接到引用共享文件夹,因为会丢失连接并且无法使用dll。 - wjhguitarman
3个回答

5

您需要告诉机器信任该位置。

您可以使用caspol实用程序来完成此操作。


3
重要提示:在 .NET Framework 4 及更高版本中,只有在将 <legacyCasPolicy> 元素设置为 true 时,Caspol.exe 才会影响 CAS 策略。有关更多信息,请参阅 .NET Framework 4 中的安全更改。请访问http://msdn.microsoft.com/en-us/library/cb6t8dtz%28v=vs.100%29.aspx。 - Dirk Vollmar
谢谢您的免责声明。(上次我遇到可信位置问题是在2.0版本) - hometoast
没错,这个答案是可以接受的,但如果我不想使用caspol工具而是在代码中完成呢?问题是我们必须将其交付给客户,我们希望代码负责加载,客户端不需要进行任何维护/修改。 - Amit Pandey
1
我认为这是你必须在应用程序安装中处理的事情。 - hometoast
1
如果我不能更改代码怎么办?我还能以某种方式使程序信任共享吗?在我的情况下,我正在从VirtualBox主机专用网络运行程序,因此我希望Windows完全信任该共享。 - Arne

4

3

另外,从磁盘加载文件并在字节数组上调用 Assembly.Load 似乎可以工作(框架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作为资源的过程类似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接