C#Assembly.LoadFrom(myNetworkPath)抛出FileLoadException

时间:2013-12-09 03:54:19

标签: c# networking dll .net-assembly

我正在开发一个从DLL文件汇编类的小型演示。

这是我的代码:

string path = @"\\192.168.1.3\shareFolder\testzwm.dll";
Assembly ass = Assembly.LoadFrom(path);

总是抛出FileLoadException

但是,如果我改为:

string path = @"C:\testzwm.dll";
Assembly ass = Assembly.LoadFrom(path);

有效。

这是否意味着我无法从网络路径加载DLL?我认为这没有意义。 我在\ 192.168.1.3 \ shareFolder

中有读/写权限

如果我将第一个路径更改为\ 192.168.1.3 \ shareFolder \ testzwmWRONG.dll,则会抛出FileNotFoundException,与FileLoadException不同。

所以我猜这是一些安全问题

非常感谢任何帮助。

------------------ EDIT ------------------ 我的项目是Windows Form Application。

2 个答案:

答案 0 :(得分:4)

将以下内容添加到配置文件

<configuration>
   <runtime>
      <loadFromRemoteSources enabled="true" />
   </runtime>
</configuration>

另外阅读这篇文章 http://blogs.msdn.com/b/shawnfa/archive/2009/06/08/more-implicit-uses-of-cas-policy-loadfromremotesources.aspx

答案 1 :(得分:1)

虽然Mike的答案是正确的,但它可能会产生一些潜在的不良副作用。启用loadFromRemoteSources会更改整个应用程序的安全配置,以允许加载任何远程程序集。

另一种方法是将文件内容加载到字节数组中,然后使用Assembly.Load加载它:

public static Assembly LoadRemoteAssembly(string filename)
{
    byte[] asmdata = System.IO.File.ReadAllBytes(filename);
    return Assembly.Load(asmdata);
}

虽然您仍然试图通过欺骗.NET框架从网络加载程序集来绕过应用程序安全性,但您不会将应用程序打开到网络上的每个程序集。

这似乎是一个微不足道的差异,但如果您必须在安全层中挖洞,请尝试使它们孔。