子目录中的私有程序集的运行时加载

时间:2014-10-23 14:42:56

标签: c# .net .net-assembly assembly-resolution

我一直在尝试加载位于应用程序基目录下的子目录中的私有程序集。我有一个名为Sparrow.dll的程序集,它位于plugins目录下(也位于应用程序库目录下)。每当我调用Assembly.Load(" Sparrow")时,我都会收到System.IO.FileNotFoundException。

我使用带有标记的app.exe.config,并使用下面一行的同一程序集的强名称版本;

Assembly assem = Assembly.Load("Sparrow");

但是,当我将程序集更改为弱程序集时,它不起作用。

配置文件的内容如下;

<configuration>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly name="Sparrow, Culture=neutral, PublicKeyToken=xxxxxx">
            <codeBase version="1.0.1.1" href="plugins/Sparrow.dll" />
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

我读了很多东西,但我不确定使用标签来定位弱装配是否是一种好习惯。

1 个答案:

答案 0 :(得分:2)

您可以将probing元素用于此目的:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="plugins" />
    </assemblyBinding>
  </runtime>
</configuration>

该元素表示将搜索plugins子文件夹以查找程序集。 但请注意,只能以这种方式指定应用程序目录的后代路径上的目录。

您问题中的配置文件有误。根据文档,XML配置应如下所示:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
       <assemblyIdentity name="Sparrow"
                          publicKeyToken="null"
                          culture="neutral" />
       <codeBase version="1.0.1.1" href="plugins/Sparrow.dll" />
     </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

但是,我认为在您的情况下使用probing元素将是更好的选择。