一种把dll放在不同目录的巧妙方法
想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观。
如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用的程序各文件的分布:
【3rdLibs】
- NLog.dll
- Newtonsoft.Json.dll
- ……
- 【MyLibs】
- 【Resources】
- 【Images】
- Excecutable.exe
- Excecuteble.exe.config
好吧我承认以上是抄袭的http://www.cnblogs.com/marvin/p/PutDllToSpecificFolder.html,因为本人不太习惯写客套话,
说回正事,在网上搜索了很多方法效果都不好,具体方法可以看一下前面那个链接,总结起来有几种
1.切换工作路径法,此方法在多线程时会让你出错到爽歪歪,
2.调用win32api的方法LoadLibrary,这种方法只有调用单dll的时候好使,一旦调用的dll本身有其他的依赖库的时候,就完蛋
3.参加博客文章一种调用dll的方式,把模块放入单独的文件夹,通过辅助exe去调用,这种方式的劣势详见链接
下面是本人认为最佳的方式,新建抽象类SeparationLibraryClass
/// <summary>
/// 用于分离库的类
/// </summary>
public abstract class SeparationLibraryClass
{
/// <summary>
/// 删除全部库文件
/// </summary>
protected static void DeleteAllFiles(string path)
{
if( string.IsNullOrWhiteSpace( path ) )
{
return;
}
DirectoryInfo di = new DirectoryInfo( path );
if( di.Exists && di.GetFiles() != null )
{
foreach( var item in di.GetFiles() )
{
try
{
File.Delete( item.Name );
}
catch( Exception e )
{ }
}
}
}
}
使用SeparationLibraryClass方式如下
public class Test :SeparationLibraryClass
{
[DllImport( "Termb.dll", )]
public static extern int Foo( );
static Test()
{
path = "ExternalLibrary/Test/";// 此地址下放入所有依赖的文件
Helper.SmartCopyFiles( path );
}
private static readonly string path;
public static void DeleteAllLibraryFiles()
{
DeleteAllFiles( path );
}
}
建立Helper类
class Helper
{
/// <summary>
/// 对比文件并拷贝到相应位置
/// </summary>
/// <param name="file1">要想文件拷贝至此地址</param>
/// <param name="file2">原文件地址</param>
/// <returns>是否复制了文件</returns>
public static bool SmartCopyFile(string file1,string file2)
{
FileInfo fi1 = new FileInfo( file1 );
FileInfo fi2 = new FileInfo( file2 );
// fi2存在且fi1不存在时或fi1和fi2不一致时复制
if( fi2.Exists && !(fi1.Exists && fi1.Length == fi2.Length && fi1.LastWriteTime == fi2.LastWriteTime) )
{
fi2.CopyTo( fi1.FullName, true );
return true;
}
return false;
} public static void SmartCopyFiles(string path) { DirectoryInfo di = new DirectoryInfo( path ); if( di.Exists && di.GetFiles() != null ) { foreach( var item in di.GetFiles() ) { SmartCopyFile( item.Name, item.FullName ); } } } }
最后在Test类所在的项目中创建文件夹路径ExternalLibrary/Test/,把所有依赖的文件都添加进去,然后每个依赖文件右键属性设置
你估计已经猜到实现方式了,没错,就是生成时把ExternalLibrary/Test/的所有内容复制到程序目录,然后运行时复制依赖文件在程序根目录,你也许绝对这种方式很low,氮素,
这种方式最简单稳定!
种方式最简单稳定!
方式最简单稳定!
式最简单稳定!
最简单稳定!
简单稳定!
单稳定!
稳定!
定!
!
完事,吃饭去
一种把dll放在不同目录的巧妙方法的更多相关文章
- DLL放在指定目录 以及设置dll调用路径
一.DLL放在指定目录 在编写C# winform程序中,不免一个项目会有多个工程文件,而这些工程文件之间是相互引用的,所以不想将工程的生成结果(exe或者dll)放在当前工程bin目录下的Debug ...
- Unity获取插件所在目录的巧妙方法
编写插件时,Unity没有提供当前被放置目录的功能.比如资源商店的一些插件需要放在Assets根目录下. 但通过脚本可以反求出所在目录,对于自己写的插件,就避免了类似问题: var scriptObj ...
- C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
系列文章 C#开发奇技淫巧一:调试windows系统服务 C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁 程序目录的整理 ...
- 关于jsp页面是放在webroot目录下和web-inf下优缺点
CSDN问题: jsp放在webroot目录下 这样就可以让用户直接访问,jsp放在web-inf目录下就必须要通过请求才能访问.因此放在web-inf下jsp页面显得要安全. 既然这样 ,那是不是只 ...
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- Windows提供了两种将DLL映像到进程地址空间的方法
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- MSSTDFMT.dll系统文件(附2种MSSTDFMT.dll 注册方法)-系统增强
MSSTDFMT.dll系统文件(附2种MSSTDFMT.dll 注册方法)-系统增强 msstdfmt.dll是微软标准数据格式对象相关动态链接库文件. msstdfmt.dll里面包含了定义好函数 ...
- dependency walker检查dll依赖关系目录设置的问题
废话少说,直接上图 图中来看,似乎IESHIMS.DLL文件不存在报错,实际是因为没有加载IESHIMS.DLL所在的路径. 在我的电脑里面搜索有两个同名的dll,一个是32位的,一个是64位的. C ...
- U3D+SVN: 两份相同资源放在不同目录下导致META的更改
U3D+SVN: 两份相同资源放在不同目录下导致META的更改. 实际情形:将地图文件map拷一份放在其它目录,回到UNITY编辑器,载入完成后加到磁盘,看到map文件夹下的所有meta都变红了. r ...
随机推荐
- app自动测试-微信(iOS)-web-1
appium 是一个用于app自动测试的工具.目前支持测试iOS, Android, Windows上的app.(github: https://github.com/appium/appium) 其 ...
- git 以及 工作区 版本库 暂存区
https://www.jianshu.com/p/a308acded2ce 这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...
- manifest
manifest是一种软件,属于AndroidManifest.xml文件,在简单的Android系统的应用中提出了重要的信息,它可以运行任何应用程序的代码. 每个安卓应用程序必须有一个Android ...
- mongodb学习(3)--- NodeJs使用mongoose操作mongodb
转载: https://cnodejs.org/topic/50c145ed637ffa4155c7eaee 首先对于以下错误说明(有写 db.close): Error: db object alr ...
- Windows + Eclipse 构建mahout运行环境
mahout的完整运行还是需要hadoop的支持的,不过很多算法只需要能把hadoop的jar包加入到classpath之中就能正常运行. 比如我们在使用LogisticModelParameters ...
- 所驼门王的宝藏(bzoj 1924)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- python实现贪吃蛇
贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾. 只是一个贪吃蛇只需要70行代码左右就可以了,后来又 ...
- 手机横屏时候提示请竖屏浏览纯css实现
//今天无意间浏览nike公众号看到的 最近也正在做着就记录下来备忘<!DOCTYPE html> <html lang="en"> <head> ...
- TCP/IP协议详解笔记——ARP协议和RARP协议
ARP:地址解析协议 对于以太网,数据链路层上是根据48bit的以太网地址来确定目的接口,设备驱动程序从不检查IP数据报中的目的IP地址.ARP协议为IP地址到对应的硬件地址之间提供动态映射. 工作过 ...
- 移动端web如何让页面强制横屏
前段时间公司针对直播服务做了改版升级,APP客户端支持了横屏和竖屏推流/播放. 在这个背景下,虽然触屏未做改动,但本着敏而好学,不断探索的精神,针对如何让web页面强制横屏显示,做了一下试验研究. 首 ...