日期:2014-05-20  浏览次数:20718 次

【200分,不够再加】如果利用配置文件指定程序集的位置
之前就发过一个20分的贴子:http://topic.csdn.net/u/20091127/21/a67465c7-44ce-4e5f-95a7-42d98ba4e4d9.html

结果没几个人关注,所以现在提高到10倍,发一个200分的贴子,希望有人能解决.

问题描述如下:

首先写一个Library.dll:
class Library
{
}

生成一个Library.dll文件,置于 d:\my\Library.dll

然后写一个Demo.exe,添加对Library.dll的引用,添加一个配置文件App.config(编译之后,会在exe目录产生一个demo.exe.config文件),并编写如下代码:

Console.WriteLine(typeof(Library).Assembly.Location);

使其输出为d:\my\Library.dll


运行时,demo.exe和demo.exe.config文件在同一目录下,而dll被我移走了,跟exe的路径无关,而是在前面提到的位置d:\my\Library.dll

请问,配置文件应该怎么写,才能正常运行,并使Console.WriteLine(typeof(Library).Assembly.Location)输出的路径为d:\my\Library?

我自己在网上查到的方法是这样的,但是不对:


XML code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity Name="Library" Culture="neutral" PublicKeyToken="null" />
        <codeBase version="1.0.0.0" href="FILE://D:/my/Library.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

即使给Library产生一个PublicKeyToken,并在配置文件中指明,也是没用的




麻烦给出配置文件的全部内容

另外,请问配置文件的codeBase路径和GAC,哪个的优先级高?

假如我把GAC中的System.Windows.Forms.dll复制到d:\my\System.Windows.Forms.dll,要使程序中的:
Console.WriteLine(typeof(Form).Assembly.Location)输出为d:\my\System.Windows.Forms.dll,也就是让程序优先使用我请明的程序级,而不是优先使用GAC中的程序集,应该怎么办?

------解决方案--------------------
不会 
Up
------解决方案--------------------
我们使用的是

assembly = Assembly.LoadFrom( basePath + "AccessCodeGenerator\\SnakeEyes\\Fulfilment.AccessCodes.SnakeEyes.dll" );
generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGeneratorSnakeEyes" );

没有问题
------解决方案--------------------
关注
------解决方案--------------------
一篇文章http://blogs.msdn.com/junfeng/archive/2004/11/16/258081.aspx
我自己也正在试验如何使用CodeBase
------解决方案--------------------
好话题,顶起,学习
------解决方案--------------------
找到原因了。
看起来publickey是很重要的。下面的配置是ok的。
 <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="ClassLibrary1" publicKeyToken="2af6181c6a13eff6" culture="neutral"/>
<codeBase version="1.0.0.0" href="D:\test prj\vs2008\TestCodeBase\ClassLibrary1\bin\Debug\ClassLibrary1.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>

如何为dll生成publickey呢,很简单。
dll项目属性
Signing页
选中 Sign the assembly 
可以新建一个密钥文件,随便输入一个名字,不用加密。

至于如何取得assembly的public key.
我是使用的reflector
http://www.red-gate.com/products/reflector/

------解决方案--------------------
下面的方法楼主可以试试
不过可能不是你想要的
因为这种指定路径的方法必须是处于主程序所以文件夹的子文件夹
[code=C#]
在配置文件中增加一节,如下

<configuration>
<runtime>
<assemblyBinding xmlns= "urn:schemas-microsoft-com:asm.v1 ">
<probing privatePath= "bin;bin2\subbin;bin3 "/>