小弟学C#不久,最近在项目开发中遇到个问题,麻烦兄弟帮忙解决!
我们有个WinForm和WinService在同一个解决方案了,共同引用了许多一样的dll.但是打包生成安装程序,安装后每个dll都发布到每个项目中。
项目结构如下:
A
A\WinFormA
A\WinFormA\a.dll
A\WinFormA\b.dll
A\WinServiceA
A\WinServiceA\a.dll
A\WinServiceA\b.dll
感觉dll都重复了,升级等操作都比较麻烦,可不可以将公用的dll放到根目录A下或者根目录A下的一个子目录,供WinFormA和inServiceA调用?小弟之前是学Java的,不知道这样的想法是否可行?
将 DLL 注册 到 GAC 中去
http://www.cnblogs.com/boypig/archive/2011/10/26/2225355.html
http://www.cnblogs.com/lovablebox/archive/2007/12/05/983599.html
谢谢,因为我们的程序是安装到客户那边,将DLL注册到GAC中不是很现实,也不是很方便!除了GAC这种方式,还有其他便于操作的方式吗?
@xrksudy:
写个 脚本 注册 到 GAC 也不是 难事 啊。
如果你不愿意
那提供 第二种办法:
添加 程序 的 ProbingPath
///<summary>
/// 添加 Dll 搜索路径
///<example>AppendProbingPath("bin", "lib")</example>
///</summary>
public static void AppendProbingPath(params string[] path)
{
#pragma warning disable 612,618
AppDomain.CurrentDomain.AppendPrivatePath(path.Join(';'));
#pragma warning restore 612,618
}
3. 修改 Config 文件 添加 ProbingPath
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="myapp/bin" />
</assemblyBinding>
</runtime>
这样 你可以 将 功用的 Dll 放进 Lib 文件夹中
将 ProbingPath 添加进去 就 OK 了,
关于 ProbingPath 剩下的 自己搜、
@waninlezu: 非常感谢!
@waninlezu: 谢谢,我试了下,查询相关资料和自己测试了下,ProbingPath只能设置为本项目下的子目录,只能将公用dll构造成如下格式:
A
A\WinFormA
A\WinFormA\b\a.dll
A\WinFormA\b\b.dll
A\WinServiceA
A\WinServiceA\b\a.dll
A\WinServiceA\b\b.dll
但是要设置成这用格式就不行!
A
A\WinFormA
A\WinServiceA
A\b\a.dll
A\b\b.dll
能不能再帮忙解答下,谢谢!
@xrksudy:
我说 大哥,你 注册到 GAC 不就 没事了 ,搞这么多 飞机。。
好吧。还有一种 方式。
订阅 AppDomain 的 AssemblyResolve 事件
AppDomain.CurrentDomain.AssemblyResolve+=AssemblyLoading
这个 的 用法 是 当 jit 编译时 手动 加载 引用的 程序集,
你自己 查下 用法。
需要注意 要在 Jit 编译到 指定类型前 必须 将 程序集 载入 AppDomain,
这种方式 灵活性 较大,可以加载 任何 你能访问到的 程序集,如资源文件,网络,动态编译 等。
当然 也可以用来 解决你的问题。
@waninlezu: 谢谢!