【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 "/>