【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 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,并在配置文件中指明,也是没用的
</assemblyBinding>
</runtime>
</configuration>
可以在MSDN中索引 <probing>
[/code]
[解决办法]
不是同一路径,exe路径是
D:\test prj\vs2008\TestCodeBase\TestCodeBase\bin\Debug\TestCodeBase.exe
[解决办法]
顶~~~~~
[解决办法]
貌似publicKeyToken不能为null
[解决办法]
据 http://book.csdn.net/bookfiles/650/10065020609.shtml 说
从上面可以看到,<codeBase>元素内嵌在<assemblyIdentity>元素中。<assemblyIdentity>元素使用name特性和publicKeyToken特性定义友好名称和对应的publicKeyToken的值。<codeBase>元素则指定需要加载的程序集的版本和位置(通过href属性)。现在,如果只把GAC中的CarLibrary.dll的2.0.0.0版本删除,则客户端程序仍然可以正常运行,因为CLR在C:\MyAsms下能够找到被请求的程序集。
但是如果把MyAsms目录删除,则客户程序将会运行失败。这是因为<codeBase>元素的设置优先于GAC。
Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll")
[解决办法]
。net 的吗 给你个方法 动态加载调用托管dll
/// <summary> /// 动态调用托管dll function showform:boolean;stdcall; /// </summary> /// <param name="lpFileName">dll文件名</param> /// <param name="Namespace">命名空间</param> /// <param name="ClassName">类名</param> /// <param name="lpProcName">方法名</param> /// <param name="ObjArray_Parameter">参数</param> /// <returns></returns> public static object Invoke(string lpFileName, string Namespace, string ClassName, string lpProcName, object[] ObjArray_Parameter) { try { // 载入程序集 Assembly MyAssembly = Assembly.LoadFrom(lpFileName); Type[] type = MyAssembly.GetTypes(); foreach (Type t in type) {// 查找要调用的命名空间及类 if (t.Namespace == Namespace && t.Name == ClassName) {// 查找要调用的方法并进行调用 MethodInfo m = t.GetMethod(lpProcName); if (m != null) { object o = Activator.CreateInstance(t); return m.Invoke(o, ObjArray_Parameter); } else MessageBox.Show(" 装载出错 !"); } } }//try catch (System.NullReferenceException e) { MessageBox.Show(e.Message); }//catch return (object)0; }// Invoke
[解决办法]
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="D:\my\"/>
</assemblyBinding>
</runtime>
楼主试一下吧!
[解决办法]
[解决办法]
有点高深...
[解决办法]
不懂。。
[解决办法]
路过。up
[解决办法]
引用49楼的就行了
[解决办法]
... ...
[解决办法]
的确是深了点,学习........
[解决办法]
uP
[解决办法]
参考学习中
[解决办法]
xuexixuexi
[解决办法]
顶~
[解决办法]
o 学习咯~
[解决办法]
48楼 不错~ dll的确在这个里面也有
------解决方案--------------------
学习
[解决办法]
学习
[解决办法]
关注
[解决办法]
我也这样用assembly = Assembly.LoadFrom( basePath + "AccessCodeGenerator\\SnakeEyes\\Fulfilment.AccessCodes.SnakeEyes.dll" ); generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGeneratorSnakeEyes" ); 没有问题
[解决办法]
sharp_future你的图像不错!
[解决办法]
顶起
[解决办法]
在应用程序配置文件中输入以下 XML:
复制代码
<?xml version ="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" />
</startup>
</configuration>
[解决办法]
使用 元素
只有在计算机配置文件或也重定向程序集版本的发行者策略文件中,才可以使用 <codeBase> 元素。在运行库确定要使用哪一程序集版本时,它应用确定版本的文件中的基本代码设置。如果未指出基本代码,那么运行库就以通常的方法探测程序集。有关详细信息,请参见运行库如何定位程序集。
下面的示例说明如何指定程序集的位置。
复制代码
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<codeBase version="2.0.0.0"
href="http://www.litwareinc.com/myAssembly.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
对于所有具有强名称的程序集,要求 version 属性,但对于不具有强名称的程序集应省略。<codeBase> 元素要求 href 属性。在 <codeBase> 元素中不能指定版本范围。
[解决办法]
学习下
[解决办法]
面的示例说明如何指定程序集的位置。
复制代码
[解决办法]
学习之
[解决办法]
学习中
[解决办法]
[解决办法]
ert yrtytr
[解决办法]
gdf g r r
[解决办法]
顶
[解决办法]
.
[解决办法]
帮 顶
[解决办法]
帮顶 学习 刚学习 C++
------解决方案--------------------
恭喜恭喜啊,分数提高吸引这么多人过来啊
[解决办法]
马克
[解决办法]
关注中
[解决办法]
关注!
[解决办法]
不能给你解决问题但是留下足迹以示支持
[解决办法]
标题错了吧?我也不知道。等答案....
[解决办法]
关注
[解决办法]
我是个门外汉!但谁能帮我找回QQ啊 这是我现在的624316753
谢谢
[解决办法]
頂,學習
[解决办法]
不会,等答案……
[解决办法]
關注..
[解决办法]
加油啊!!!
有问题才有进步!!!!
[解决办法]
不懂,但是先学习。。。
[解决办法]
//试试下面的//路径也可以写在INI文件或者XML文件中[System.Runtime.InteropServices.DllImport("读取配置文件中的路径", EntryPoint = "方法", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = false)] static extern int 方法();