[转]Vs消除方案的目录结构安装和治本

图片 1

【无私分享:从入门到明白ASP.NET MVC】从0开端,一起搭框架、做项目 目录索引

  

 

注解:获取或设置当前工作目录的完全限定路径。该属性之中调用的就是System.IO.Directory.GetCurrentDirectory()方法,二者是作用是等价的。

单点登录

 

  假诺可操作系统验证通过,我们检查和测试一下布置文件是或不是打开了单点登录:单点登录的兑现格局实际一点也不细略,那里大致跟大家说一下思路

  首先,大家有个用户在线状态表
UserOnlie

  图片 2

  当我们创立用户的时候,那里也会创建3个 一对一
的用户在线状态记录。

  大家在最外层的后台主页面中,有个 Signal索罗德-Hubs
,也是与在那之中聊天室一体的,当用户登录后或再一次连接时,我们便更新用户的在线状态:

  图片 3

  当用户离线时,大家创新用户的在线状态为离线:

  图片 4

 

  通过那个大约的艺术,很简陋的落成单用户登录格局。

 

 

  OK,那样基本的手续正是成功了,要是用户不在线或尚未打开单用户登录,那么大家记录Session和Cookies,借使打开了单用户情势,并且用户已在线,那么大家登录失利,提醒当前用户,用户已报到

  json.Msg =
“当前用户已登录,系统差别意再一次登录!登录IP:” +
UserOnline.UserIP;

 

  那几个Login方法我们能够修改部分串行的主意为异步并行,提升功用。登录页的UI
在在此之前的稿子以及本文顶部 已经给大家分享,源码
在前边的文章中也有,不过没有参预单点登录,这一个是后来丰富的,那里再给大家贴一下完好的报到控制器:

  

图片 5图片 6

  1 using Common;
  2 using Service.IService;
  3 using System;
  4 using System.Collections.Generic;
  5 using System.Linq;
  6 using System.Web;
  7 using System.Web.Mvc;
  8 
  9 namespace WebPage.Areas.SysManage.Controllers
 10 {
 11     public class AccountController : Controller
 12     {
 13         #region 声明容器
 14         /// <summary>
 15         /// 用户管理
 16         /// add yuangang by 2016-05-16
 17         /// </summary>
 18         IUserManage UserManage { get; set; }
 19         /// <summary>
 20         /// 用户在线管理
 21         /// </summary>
 22         IUserOnlineManage UserOnlineManage { get; set; }
 23         /// <summary>
 24         /// 日志记录
 25         /// </summary>
 26         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
 27         #endregion
 28 
 29         #region 基本视图
 30         public ActionResult Index()
 31         {
 32             //移除Session
 33             SessionHelper.Remove("CurrentUser");
 34             CookieHelper.ClearCookie("cookie_rememberme");   
 35             return View();
 36         }
 37         /// <summary>
 38         /// 登录验证
 39         /// add yuangang by 2016-05-16
 40         /// </summary>
 41         [ValidateAntiForgeryToken]
 42         public ActionResult Login(Domain.SYS_USER item)
 43         {
 44             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
 45             try
 46             {
 47                 //获取表单验证码
 48                 var code = Request.Form["code"];
 49                 if (Session["gif"] != null)
 50                 {
 51                     //判断用户输入的验证码是否正确
 52                     if (!string.IsNullOrEmpty(code) && code.ToLower() == Session["gif"].ToString().ToLower())
 53                     {
 54                         //调用登录验证接口 返回用户实体类
 55                         var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
 56                         if (users != null)
 57                         {
 58                             //是否锁定
 59                             if (users.ISCANLOGIN)
 60                             {
 61                                 json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
 62                                 log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
 63                                 return Json(json);
 64                             }
 65 
 66                             var acconut = this.UserManage.GetAccountByUser(users);
 67 
 68                             //系统访问正常
 69                             if (acconut.System_Id.Count > 0)
 70                             {
 71                                 //是否启用单用户登录
 72                                 if (System.Configuration.ConfigurationManager.AppSettings["IsSingleLogin"] == "True" )
 73                                 {
 74                                     var UserOnline = UserOnlineManage.LoadListAll(p => p.FK_UserId == users.ID).FirstOrDefault();
 75                                     if(UserOnline!=null && UserOnline.IsOnline)
 76                                     {
 77                                         json.Msg = "当前用户已登录,系统不允许重复登录!登录IP:" + UserOnline.UserIP;
 78                                         log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "重复登录:" + json.Msg);
 79                                     }
 80                                     else
 81                                     {
 82                                         //写入Session 当前登录用户
 83                                         SessionHelper.SetSession("CurrentUser", acconut);
 84 
 85                                         //记录用户信息到Cookies
 86                                         string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
 87                                                              "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
 88                                                              Session.SessionID + "\"}";
 89                                         CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),
 90                                             null);
 91 
 92                                         json.Status = "y";
 93                                         json.ReUrl = "/Sys/Home/Index";
 94                                         log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
 95                                     }
 96                                 }
 97                                 else
 98                                 {
 99                                     //写入Session 当前登录用户
100                                     SessionHelper.SetSession("CurrentUser", acconut);
101 
102                                     //记录用户信息到Cookies
103                                     string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
104                                                          "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
105                                                          Session.SessionID + "\"}";
106                                     CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),
107                                         null);
108 
109                                     json.Status = "y";
110                                     json.ReUrl = "/Sys/Home/Index";
111                                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
112                                 }
113                             }
114                             else
115                             {
116                                 json.Msg = "站点来源不可信,系统拒绝登录";
117                                 log.Warn(Utils.GetIP(), "其他系统访问者", "", "Login", "其他系统登录失败,原因:系统验证错误,系统拒绝登录");
118                             }
119 
120                         }
121                         else
122                         {
123                             json.Msg = "用户名或密码不正确";
124                             log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
125                         }
126                     }
127                     else
128                     {
129                         json.Msg = "验证码不正确";
130                         log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
131                     }                    
132                 }
133                 else
134                 {
135                     json.Msg = "验证码已过期,请刷新验证码";
136                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
137                 }              
138             }
139             catch (Exception e)
140             {
141                 json.Msg = e.Message;
142                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
143             }
144             return Json(json, JsonRequestBehavior.AllowGet);
145         }
146         #endregion
147 
148         #region 帮助方法
149         /// <summary>
150         /// 验证码
151         /// </summary>
152         public FileContentResult ValidateCode()
153         {
154             string code = "";
155             System.IO.MemoryStream ms = new Models.verify_code().Create(out code);
156             Session["gif"] = code;//验证码存储在Session中,供验证。  
157             Response.ClearContent();//清空输出流 
158             return File(ms.ToArray(), @"image/png");
159         }
160         #endregion
161     }
162 }

View Code

 

 

卖源码?

 

  很多对象都在牢骚,说博主终于依然商业化了…

 

  首先呢,到近年来截止,作者从不卖一套源码,即便您在大家的沟通群里,你可以问问我们,很多私聊小编买源码的心上人,笔者都以跟他们说先依据新浪的篇章本身做,学会才是指标,单纯的源代码是绝非任何意义的,天涯论坛贴出的源码跟自身项目中源码的唯一差距便是,作者项目中的源码没有注释,实在可怜再来找笔者。

 

  第三啊,有些源码出售网站惊现
果冻博客源码…
那让本人很受惊,首先是受宠若惊,巧合的是,有个源码网站是自个儿爱人的,要不是她发给笔者自个儿还真不知道,作者是不反对那种作为的,你学会了正是您的,卖或不卖是您的事,不过扒下来的代码,都尚未通过测试,这么多错误,都跑不起来,就拿来出售,是很不优良的。

 

  第1啊,我上边说过了,腾讯网贴出的源码
跟自家源码的绝无仅有分歧正是,小编项目中源码是不曾这么多注释的。假如一味是分享源代码,大能够放置GitHub上,难道一步一步贴出源代码不就享受源码,唯有把全部的打个包发给各个人才叫享受源码吗?那天涯论坛的意义是?和讯不是GitHub,三个站的目的是分歧的。对于同一是新手的本身来说,github上的纯粹的源代码,即使ReadMe
写的不详细,是极不赏心悦目懂的,更毫不说清楚运用了,假如一篇一篇文章,一步一步解释,一条一条注释,然后贴出总体的,都不可能精通的话,直接2个总体的源码就能看懂吗?

 

  伤不起。。。

 

 

 

这个动态链接库,往往都以测试版本或是开发中的版本,或然会有好多个版本;这么些时候,假如直白把
dll 所在目录加到 PATH 里,则会有地下争执的危险;假设一向拷贝到 Visual
Studio
的目录下,假设测试工程太多,每趟有新本子的动态链接库更新时,你须要立异若干次,拷贝、粘贴苦不堪言。

索引

 

  

别的常用的习性还有,“调节和测试”栏目中的“工作目录”项,那几个脾性私下认可情状下是空的,但象征工作目录是工程目录,也正是工程布署文件ssyy.vcproj所在目录。工作目录表示实行某项操作的目标目录,会趁着OpenFileDialog、SaveFileDialog等指标所鲜明的目录而改变。“行事目录”属性功用是程序运营后唯一识其余暗许目录,即工作后只认识这么些目录,工作目录这么些名字描述的就很形象,(能够将所依靠的lib和dll库文件所在目录设为工作目录,但一般是把lib放在消除方案下的Lib目录中,把dll放在化解方案下的Bin目录中),例如程序运营进度中变化2个txt文本文件,假若在创造文件进程中未钦定绝对路径,只钦赐创立文件的文件名,那么这几个文件文件暗中认可就会成立在工作目录中,当然读取一些配备文件也在做事目录中查找,但要说圣元(Synutra)下,生成的exe文件跟工作目录没别的涉及,也不会放在工作目录中。总的来说,工作目录就是程序运维进程中暗中同意读取的目录。对于dll,假若是程序运维前就进来内部存款和储蓄器有点像静态链接那样,此时dll就足以放入exe所在的进行目录,尽管dll是运营中动态加载的貌似位于工作目录,比如插件就位于工作目录。即工作目录正是运营时期唯一能识别的暗中同意目录,工作目录在代码中用GetCurrentDirectory之类的函数获取,具体代码间最上面包车型客车附1。工作目录与实施目录能够不一致,例如一人住在香江,但他的办事地方不自然在时尚之都市,恐怕在里昂。

前言

  

  后边还尚未下载到UI和数据库的,那里再一次给我们提供一下:百度网盘
 提取码:fuuv
,UI是参照H+,不过H+是收费授权的(¥998奥迪Q3MB),价格有点贵,所以 大家的 UI
跟H+ 即便是2个品格,不过大家能够见见,CSS基本用的都以Bootstrap,JS
基本都是 最新的开源插件和和谐重写的,不存在版权难题。

 

  大家前一章早已重写了咱们的囤积类,作品中接口都已列出,达成类也说的很明白,引入
uow 后,大家修改一下原本的交给,就足以。但是不少对象 总感到
不给你文件 是因为 有个别东西一贯不放给你,那么 就重新给大家 下载一下
笔者的囤积,我们能够对照一下,是还是不是博客中故意少些东西。修改后的存款和储蓄:百度网盘
提取码:qw64 

实在,只是想让大家自身动手一下,修改章程很简短,正是把我们事先的艺术加上个条件:
bool
IsCommit=true,当大家只进行一项操作的时候,暗中同意直接交给,当大家实行多项操作的时候,可以流传false,不提交,然后通过uow
统一交由。我们能够看一下,使用的例子:

  图片 7

 

 

 

 

【同样在调节选项下的和劳作目录选项同一流的选项“命令”选项是安装,使用调节和测试时,从哪儿运营exe文件,因为一般生成的exe放在bin目录下的debug或release目录下,所以命令选项一般为“Bin$(Configuration)$(ProjectName).exe”,暗中认可也是这一个值,当然可以变更,但此时期表调节和测试情状下运营的exe为“命令”选项中设置的exe文件,而不是暗许的bin目录下的debug或release下的exe文件了。最终说一下,上边所说的“调节和测试”是指vs下运转exe,包罗debug情势和release方式,不要把调试就领悟为唯有debug情势。】

登录

  该正事了

  登录控制器
/Areas/SysManage/AccountController,一共有八个视图,七个方法:登录页面、登录验证、验证码。

  图片 8

  

  首先,我们以此控制器跟区域里别的控制器的贰个界别就是,大家尚无继承
BaseController,大家得以看下大家的
BaseController
都干了些什么:

  ①
公用变量:重要就是用来试图页传递一些公用变量,例如:查询关键字、分页页码、分页条数等。

  ②
用户对象:网站后台的总指挥,大家先是从Session中收获用户,即使Session
失效,那么大家从Cookies中取得用户信息,模拟登录重新赋值 Session
并得到用户,假诺Cookies也失效,那么重新登录。

  ③
邮箱域名:这一个是当中国集中国人民邮政总局公司件用的,大家那里并非。

  ④ 登录验证

  ⑤ log4net日志封装方法

  ⑥ 输出新闻

  ⑦
模块权限验证:大家对每1个模块都有独立的权能,并且监察和控制Action和Method,在前头大家曾经到位了对模块权限的初步化和自定义权限扩充,那里大家就需求表达当前用户,对此模块的Action
是还是不是有相应的操作权限(例如:添加、修改、删除、列表以及自定义的诸如
审核、打字与印刷、下载等),并且输出权限到视图,同时在视图页对没有相应权限的按钮Remove掉。通俗的讲,正是大家Remove掉视图页中尚无权限的按钮,并且监察和控制后台Action的操作,所以就是你本身添加上相应的按钮和办法,提交到后台时也不会通过认证。

  图片 9

 

  通过地点详细的分解,咱们能够发现,登录页是不须求这么些的,不过后台操作的任何控制器都急需,所以它们都三番五次了BaseController
但是,登录控制器不供给。

 

  我们再回头看大家的AccountController:

 

   Index
这一个没什么可诠释的,正是登陆页面,大家只是实施了移除Session和Cookies操作。

 

  我们来看下登录验证措施:

 

  首先,大家是要表明验证码。(不区分轻重缓急写)if
(!string.IsNullOrEmpty(code) && code.ToLower() ==
Session[“gif”].ToString().ToLower())

  然后,大家由此用户输入的账号和密码验证用户,那里,大家由此匹配账号和密码重临用户的实体类 var users =
UserManage.UserLogin(item.ACCOUNT.Trim(),
item.PASSWOOdysseyD.Trim());

  值得注意的是:因为大家用的加密算法是动态密钥的,所以对相同的字符串每一回加密后的密文都以不平等的,由此大家不能够由此对用户输入的密码实行加密后与数量匹配,而是经过账号取出密码,对密码进行解密与用户输入匹配的艺术申明:

  图片 10

  

  即使回去正常,大家先是还要验证用户是不是被明确命令禁止登录:

  图片 11

  

  假诺这一步验证也因此,我们由此 var acconut =
this.UserManage.GetAccountByUser(users); 获取ViewModel:Account

  

 1 public class Account
 2     {
 3         #region Attribute
 4         /// <summary>
 5         /// 主键
 6         /// </summary>
 7         public int Id { get; set; }
 8         /// <summary>
 9         /// 姓名
10         /// </summary>
11         public string Name { get; set; }
12         /// <summary>
13         /// 登录的用户名
14         /// </summary>
15         public string LogName { get; set; }
16         /// <summary>
17         /// 姓名拼音
18         /// </summary>
19         public string PinYin { get; set; }
20         /// <summary>
21         /// 登录密码
22         /// </summary>
23         public string PassWord { get; set; }
24         /// <summary>
25         /// 是否管理员
26         /// </summary>
27         public bool IsAdmin { get; set; }
28         /// <summary>
29         /// 用户头像
30         /// </summary>
31         public string Face_Img { get; set; }
32         /// <summary>
33         /// 部门职务
34         /// </summary>
35 
36         public string Levels { get; set; }
37         /// <summary>
38         /// 用户所属系统Id
39         /// </summary>
40         public List<string> System_Id { get; set; }
41         /// <summary>
42         /// 用户主部门
43         /// </summary>
44         public Domain.SYS_DEPARTMENT DptInfo { get; set; }
45         /// <summary>
46         /// 权限集合
47         /// </summary>
48         public List<Domain.SYS_PERMISSION> Permissions { get; set; }
49         /// <summary>
50         /// 角色的集合
51         /// </summary>
52         public List<Domain.SYS_ROLE> Roles { get; set; }
53         /// <summary>
54         /// 用户岗位集合
55         /// </summary>
56         public List<Domain.SYS_POST_USER> PostUser { get; set; }
57         /// <summary>
58         /// 用户可操作的模块集合
59         /// </summary>
60         public List<Domain.SYS_MODULE> Modules { get; set; }
61         #endregion
62     }

 

  那几个类里面富含了用户的骨干音信和可操作的系统、模块以及相应的权力音信。

 

 
 下一步,大家先来说澳优(Nutrilon)下,用户可操作的连串(那里起名有个别误导了,应该叫Systems,System_Id给人的回想是系统ID,而不是系统集合): if
(acconut.System_Id.Count > 0)

  

 

下边初叶开始展览所举事例的工程安装:

 

上边举二个多品种例子(vc++例子):(转自:http://blog.163.com/zhang_bo1983/blog/static/16992223020123753334981/

我们能够依照项指标实际境况,灵活选拔以上措施。

下图是某三个工程具有安装的事例:

 

7.PureMilk和ChocoliteMilk五个项指标头文件和源文件地方不要动,任然在独家的花色文件夹内。
地点目录结构清晰,一面掌握,当我们的顺序须要营造安装包或然要打包源码
颁发的时候,它可以使得大家生存变得更便于^_^
制作安装包时我们只需将“/金霉素A/Bin/Release/”目录下的兼具文件打包。
公布和转换源码的时候我们能够打包除了Temp目录以外“/地霉素A/”上面包车型客车具备文件和目录(假诺不须要执行档,也可不包涵Bin)。

表明:获取或设置包罗该应用程序的目录的名称。重回路径末尾带“”

例如:'”file:///D:/Projects/MyTest/bin/MyTest.exe”

全部上来说,有两种方法能够转移 Visual Studio 的环境变量设置:

a)          System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

留意:调节和测试栏目下的有着选项都以为着调节服务的,如若不用调试按钮,这几个选取就不起成效。至于VC++目录以及C/C++栏目是给编写翻译器起效用的,不能是报告编写翻译器在何地寻找头文件、库文件之类的事体,大概设置任何一些编写翻译器选项,此不赘述。

例如:'”D:ProjectsMyTestbin”

        而$(TargetDir)的值是在生成exe文件后自行赋予值为exe文件所在地点。所以能够说,“输出文件”最终决定exe文件所在的地方,也最后决定了$(TargetDir)的值,$(TargetPath)和$(TargetDir)的表现是相仿的,此不赘述。

a)          System.Windows.Forms.Application.StartupPath

 

先是来设置ChocolateMilk:
1.选取“/克林霉素A/Temp/Compile/”作为项目编译时行使的中间目录
2.采纳“/放线菌壮观素A/Temp/Link/”作为项目链接的输出目录
图片 12

        其它,经超过实际际测试,发现“输出目录”属性只好起到对$(OutDir)系统变量赋值的职能,和“改变生成的.exe文件存放地点”没别的涉及。相当于说,要是“输出目录”中装置的$(OutDir)值在C盘,而“输出文件”中设置输出文件的地方为D盘,最后生成的exe文件会在D盘,“输出文件”属性才控制输出exe文件的职分。

接下去大家设置应用程序项目PureMilk:
1.选用“/达托霉素A/Temp/Compile/”作为项目编写翻译时采取的中游目录
2.选拔“/GMA/Temp/Link/”作为项目链接的出口目录
率先将配备改成All
Configuration(全体配备),这样能够让大家还要修改Debug和Release的一些;
Output Directory(输出目录,链接器)栏位填入:
$(SolutionDir)TempLink$(ProjectName)$(ConfigurationName)
Intermediate Directory(中间目录,编写翻译器)栏位填入:
$(SolutionDir)TempCompile$(ProjectName)$(ConfigurationName)
3.创设截止后拷贝执行文书到“/卡那霉素A/Bin/Release/”或“/青霉素A/Bin/Debug/”
在Command Line中填入,All配置下:
copy $(TargetPath)    $(SolutionDir)Bin$(ConfigurationName);
4.调剂时运营“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”上面包车型地铁进行文书,并以“/GMA/Bin/Debug/”或“/阿奇霉素A/Bin/Release/”为办事目录
图片 13

第①,解决方案和品种文件夹包罗关系(c++项目):

 

b)         System.AppDomain.CurrentDomain.BaseDirectory

证实:获取基目录,它由程序集争论消除程序用来探测程序集。再次来到路径末尾带“”

(3)获取和安装当前实践目录,包蕴可执行文件名

对工作目录的增加补充:vs云南中华工程公司作目录的装置是给调节和测试用的,也即你运维调节和测试后,运维1个新历程,自动把那一个新进程的工作目录设置为vs项目性质中的工作目录,然后新历程运行相应的exe程序。但是倘使不接纳vs的调剂运维exe,而是径直双击exe文件运转1个新进程时,会自行把这些新历程的干活目录设置为exe文件所在的目录,那是和vs运行调节和测试不相同的地方。所以一旦宣布的时候不把工作目录内的东西拷到exe所在的目录内,就会运转出错,因为那时候做事目录不再是vs中设置的了,而是exe文件所在的目录。最终,说一下,vs中暗中认可的vc++工程的做事目录项目标值是空的,代表暗中同意是vs工程所在目录即.vcproj文件所在目录,c#工程私下认可没测试,猜测和vc的一律。】

小心高亮的片段,首先将铺排改成All
Configuration(全体计划),那样能够让大家还要修改Debug和Release的一对;
Output Directory(输出目录,链接器)栏位填入:
$(SolutionDir)TempLink$(ProjectName)$(ConfigurationName)
Intermediate Directory(中间目录,编写翻译器)栏位填入:
$(SolutionDir)TempCompile$(ProjectName)$(ConfigurationName)
3.创设结束后拷贝动态链接库到“/阿奇霉素A/Bin/Release/”或“/GMA/Bin/Debug/”,拷贝导入库到“/罗红霉素A/Lib/”【那是因为若不安装,此时变动的dll和lib都在地点安装的出口目录中】
咱们日常都会在Debug版本的输出库后边加上字母“d”以代表那是Debug版本,在Debug配置下,修改Import
Library
栏位:
图片 14

例如:'”D:ProjectsMyTestbin”

VC能够让大家设置营造前后执行的脚本程序,所以为了形成3,
我们须求写营造后执行的台本:
图片 15

证实:获取最初内定的先后集的地点,例如,在AssemblyName对象中钦点的岗位。

以下内容为“原创”+“转发”

证实:获取钦赐路线字符串的绝对路径。也足以用GetFullPath(“.”),GetFullPath(“.\”)

.css 样式表文件

缓解方案与项目:
从VC6之后VC连串就应用解决方案(Solution)来替代原先的行事空间,用于集体和管理多个有关的体系(Project)。
小说首先演示二个虚构的缓解方案和大家期待获取的目录结构,然后使用VC二零一零的花色安装成效来一步一步达到大家的必要。
虚拟化解方案:
该虚拟化解方案名为博来霉素A,包括二个动态链接库项目ChocolateMilk和3个应用程序项目PureMilk,须要采纳一个第①方库log4cxx(Apache
log4j的C++移植版本,用于日志输出)。【注意那个事例中ChocolateMilk项目只生成三个dll,PureMilk只生成1个exe】
log4cxx是以动态库的格局编写翻译的,所以我们要求它的3样东西,分别是头文件,导入库(log4cxx.lib,
log4cxxd.lib)和动态链接库(log4cxx.dll)。
只要我们期待的目录结构如下图:

转自: http://blog.csdn.net/yyhero1/article/details/19272637

 

 

 

“附加正视性的安装”等同于在代码中写“#pragma comment(lib, “库名称.lib”)
”语句,即便运用相对路径则如下:

#pragma
comment(lib,”..\debug\TestLib.lib”);在那之中的反斜杠要用双反斜杠,因为它是先后解释的双引号包括的字符串,供给转义一下,要区分include,#include
“..TestVideoApplication.h”中并不是由程序解释的字符串,所以不用转义。

上图中,假诺项目名称为ss,则总是器生成的exe为图中所示目录下的ss-YY-.exe文件。一般的话那一个文件的职位和称号要和地点所述的“命令”选项相同,以表示链接器生成的文本和调剂时选择的公文一律。(注意调节和测试时只要没有修改源代码操作,单击调节和测试按钮后,为了加速调试速度,并不会对先后重新链接,也即不会运营链接器)

例如:'”D:ProjectsMyTestbinMyTest.exe”

“链接器”栏目下的“输入”选项下的“附加信赖项”项。此项是安装程序链接时采用的静态库。相当于链接已经编写翻译好了的“代码”。因此我们能够省略的认为那几个库就一定于大家温馨写的.cpp文件,只可是那么些库是编写翻译好了的.cpp而已(那里只需求库名称即可,搜索路径在任啥地方方设置)。

而只如果C++项目,则化解方案总文件夹下就只蕴涵化解方案布署文件sln和2个品类总文件夹和多少个Debug文件夹以及叁个Release文件夹(共八个东东,在那之中Debug和Release文件夹中存放末了生成的结果exe或dll,要小心假若不应用Release生成,则不存在Release文件夹),而项目总文件夹下蕴含C++源文件头文件、项目布局文件和3个Debug文件夹以及贰个Release文件夹(一定要注意,此处的Debug和Release文件夹仅仅存放中间编写翻译结果obj,不存放exe和dll之类的事物。如若不应用Release编写翻译,则并未对应的Release文件夹)。

VS化解方案和顺序档次文件夹以及消除方案和一一品类相应的布局文件包罗关系,假诺新建3个连串ssyy,消除方案起名fangan,注意消除方案包含项目,此时转变的最外层目录为fangan代表整个化解方案的始末都在这些文件夹内。在那些fangan文件夹内包括有fangan.sln的解决方案计划文件和3个ssyy文件夹,ssyy文件夹代表全数ssyy项指标全体内容都在这一个文件夹内,这么些文件夹内涵盖ssyy.vcproj的门类配置文件和.h头文件以及.cpp源文件。假诺在fangan消除方案下再建立一个新品类名为ssyy2,则会在fangan文件夹下生成2个ssyy2文件夹存放ssyy2项指标持有情节。

证实:获取应用程序的当前工作目录的通通限定路径。该措施是对Win32
API的GetCurrentDirectory函数的二个打包。

例如:'”D:ProjectsMyTestbinMyTest.exe”

如上图设置,假使项目名称为ss,则TargetName系统变量的值便是ss,TargetExt是扩充名为exe,此时单击调节和测试按钮(vs中的那么些小三角形按钮),会起动图中所示目录下的ss-XX-.exe文件。

一、调试-》命令

初稿地址:【转】Vs解决方案的目录结构安装和治本 作者:大明

 

补偿:vs中成立私下认可的C#品类和建立私下认可的C++项目变更的目录结构是差别等的。如若是C#连串,则化解方案总文件夹下就只含有解决方案安插文件sln和贰个品类总文件夹(共多少个东东),而项目总文件夹下包涵c#源文件、项目布局文件proj、1个Properties属性文件夹、二个obj文件夹和2个bin文件夹,在那之中obj和bin文件夹下都富含debug和release三个公文夹。obj文件夹下存放中间编写翻译结果(扩大名越发项目体系而分裂),而bin文件夹下存放最终生成的结果(扩大名一般为exe或dll)。

 

.ascx 是用户控件代码文件
.aspx webform html脚本文件
.cs 是c#类文件)
.vb 是vb类文件)
.aspx.cs 和您的webform相关的后台c#代码文件,其实跟.cs是相同的
.aspx.vb 和你的webform相关的后台VB代码文件,其实跟.vb是一样的
web.config 配置文件
.xml xml文件

ConfigurationName 配置名字,通常是Debug或者Release
IntDir 编译器使用的中间目录,产出obj文件
OutDir 链接器使用的输出目录
ProjectDir 项目目录
ProjectName 项目名字
SolutionDir 解决方案目录
TargetDir 目标输出文件所在的目录
TargetExt 目标输出的扩展名
TargetFileName 目标输出文件名,包括扩展名
TargetName 目标输出名,不包括扩展名
TargetPath 目标输出文件的全路径名

b)         System.Environment.CurrentDirectory  

c)          System.IO.Path.GetFullPath(“.”)

由地点叙述能够总括出,管理器(化解方案或项目)都会相应二个总的文件夹,这么些管理器文件夹下存放本管理器的安排文件以及子管理器。比如,解决方案是个管理器,它的文件夹下含有.sln配置文件以及子管理器ssyy项目和子管理器ssyy2项目。

例如:'”C:Documents and SettingsAdministratorMy Documents”

 

贰 、链接器-》常规-》输出文件  (表示链接器生成的exe文件放在哪以及变化的exe文件名称)图片 16

图片 17

 

  1. 平素助长到系统的 PATH
    变量里

    以此艺术最简单易行,也最直白,但是坏处是会潜移默化全局的 PATH
    设置,特别是你包涵着大批量测试用的 dll 时。

  2. 在 Visual Studio 全局安装里,把 dll 所在目录添加到 PATH 里:

    通过 Visual Studio 菜单 ==> 工具 ==> 选项 ==>
    项目和平化解决方案 ==> VC++目录,在下拉框里甄选”可执行文件”,然后把
    dll 所在路子添加进去。

  3. 直白把具有 dll 拷贝到 Visual Studio
    工程目录下,或是拷贝到生成可执行文件的文件夹(暗中同意景况下是 Debug 或
    Release 目录)下:

    那些主意也很不难,可是当您有几个工程时,你每一遍换代 SDK 及其 dll
    文件,你将要把富有的工程都更新,那个不符合文件唯一性的工程性准则。

  4. 在调节和测试程序时,让 Visual Studio 帮你切换当前工作目录到 dll
    相应的目录下:

    在 Visual Studio ==> Project ==> Properties ==> Select
    Configuration ==> Configuration Properties ==> Debugging
    ==> Working directory 里填上 dll
    所在目录,那样当在调节和测试程序时,Visual Studio
    会把当前工作目录切换来那个目录下,从而会自动读取本目录下的 dll
    文件。

    其一措施的优点很强烈,简单!副作用也很引人侧目,在你切换了当前工作目录后,你只怕会找不到程序的布署文件,在先后里写的例如”./config.ini”全体都找不到了;此外,你要把全部的
    dll 都置于那么些工作目录里,不然一律会提示说找不到 xxx.dll 的题材。

  5. 最后贰个办法,也是自己觉着最好的二个格局,在 Visual Studio
    工程属性里把一个目录方今添加到 PATH 环境变量里:

    MSDN 上也有类似的介绍:How to: Set Environment Variables for
    Projects
    ,方法很简短,在
    “工程属性” ==> “调节和测试” ==> “环境”里,添加类似如下所示的始末:

    PATH=%PATH%;$(TargetDir)DLLS
    

    如此那般就足以把 $(TargetDir)DLLS 一时添加到该工程所属的体系 PATH 里。

证实:假设带有清单的已加载文件没有被形象复制,则得到该公文的宗旨代码格式的岗位。

图片 18

 

其余,暗中同意情状下,项目性质设置的目录源点为项目计划文件所在地方,实际上正是体系头文件和源文件所在地方。

Command栏位填入:$(SolutionDir)Bin$(ConfigurationName)$(TargetFileName)
Working Directory栏位填入:$(SolutionDir)Bin$(ConfigurationName)
那般就马到功成了,以后你就能够编写翻译该执行顺序并拓展调节。

b)         System.Windows.Forms.Application.ExecutablePath

 

 

 

 “调节和测试”栏目中的“命令(Command)”属性项,【这几个性格表示调试器要运营的exe文件的姓名】,包蕴路径名,暗许为$(TargetPath),而TargetPath就象征指标输出文件的全套径名,所以一般意况下它表示的值就约等于“输出文件”属性代表的值。当然你也足以人工的更改“命令”属性的值,比如更改为c:aa.exe,而“输出文件”的值为c:bb.exe,此时只要出口文件所在目录没有aa.exe的话(因链接器只生成bb.exe而素有不会生成aa.exe),调试器就不能够运转aa.exe,提醒找不到aa.exe。当然若是目录中已经有aa.exe文件(能够强制赋值四个bb.exe文件的副本并取名为aa.exe),此时调节和测试器就足以健康调节和测试通过。

例如:'”C:Documents and SettingsAdministratorMy Documents”

附1:C#收获设置工作目录和实践目录代码

透过笔者做过的局地试验评释,即便已经经过链接器生成了exe文件,手动修改这么些exe文件名,调节和测试时假如将上海体育场地所示的精选的文书名也举办相应的修改,一样能够拓展调节并运行exe程序。

 

(1)获取和设置当前工作目录

附2:vs(首如若.Net)中常用的各体系型的公文:

例如:'”D:ProjectsMyTestbin”

帮忙,常用项目性质和连串布置变量关系:

c)          System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase

c)          System.Reflection.Assembly.GetExecutingAssembly().Location

咱俩的急需是家谕户晓的,可是VC
二零一零(VS二零一零)并不会活动为我们做好地点装有的作业。可是大家并不供给编写复杂的编写翻译脚本(makefile),只供给不难的修改项指标缺省设置即可。
大家必要VC(VS)为大家做的事体包涵:
1.行使“/克林霉素A/Temp/Compile/”作为项目编写翻译时利用的中等目录
2.用到“/创新霉素A/Temp/Link/”作为项目链接的出口目录
3.当项目是应用程序时,在营造结束后拷贝执行文书到“/庆大霉素A/Bin/Release/”或“/威他霉素A/Bin/Debug/”,当项目是动态链接库时,除了拷贝dll到Bin,还拷贝导入库到“/达托霉素A/Lib/”
4.当档次是应用程序时,调试时运转“/丙胺搏来霉素A/Bin/Debug/”或“/林大霉素A/Bin/Release/”上面包车型大巴进行文书,并以“/丙胺搏来霉素A/Bin/Debug/”或“/维生霉素A/Bin/Release/”为工作目录
率先看一下品类安装中得以接纳的宏,常用的有:

有鉴于此,c#品种暗中认可生成的文件目录结构更客观,且输出的exe位于总项目文件夹内,而c++项目暗许exe位于消除方案总文件夹下。其它c#更客观在,C#利用Bin目录,在Bin目录下富含debug和release八个目录,而C++不采纳Bin目录,直接行使debug和releae七个目录。

 

 

a)          System.IO.Directory.GetCurrentDirectory()

 

末尾说一下,在付出进程中,究竟什么样来让 Visual Studio 链接那个 lib 及
dll 文件会相比好吧?

图片 19
留意:从上海体育场地能够见见,TargetDir指目标目录,是3个目录。而TargetPath是目的路径,蕴含具体的公文名

附:*.ascx *.asax *.aspx.resx
*.asax.resx是如何文件

        上边两段说了那样多,小结就是,默许情形下“输出目录”和“输出文件”八个天性对应的目录是一致的,这样用着方便(当然,输出文件的值在输出目录的值的基础上还带有有exe文件名)。要是三个差异,则中间生成的链接器用的如xx.ilk和xx.pdb文件等在输出目录,而结尾生成的xx.exe文件在“输出文件”属性设置的目录中。

此外,上边两段话能够计算出,当调节和测试程序时,系统变量$(OutDir)的值是第1鲜明的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才规定的。约等于说系统变量$(OutDir)的值由VS项目标“输出目录”属性决定,而$(TargetDir)和$(Target帕特h)的值由VS项目标“输出文件”属性决定。即设置了VS的“输出目录”属性就也正是设置了$(OutDir)的值,“输出目录”是界面上的唤醒用于收纳用户输入的配备音讯,然后把这么些具体的安排音信存入系统内容的变量$(OutDir)中。

sln:化解方案文件,为解决方案能源管理器提供展现管理文件的图纸接口所需的音讯。 
.csproj:项目文件,创造应用程序所需的引用、数据连接、文件夹和文件的音信。 
.aspx:Web
窗体页由两部分组成:视觉成分(HTML、服务器控件和静态文本)和该页的编制程序逻辑。Visual
Studio 将那五个组成都部队分分别存款和储蓄在3个单身的文件中。视觉成分在.aspx
文件中创设。
.aspx.cs:Web
窗体页的编制程序逻辑位于三个独门的类公事中,该公文称作代码隐藏类文件(.aspx.cs)。 
.cs: 类模块代码文件。业务逻辑处理层的代码。 
.asax:Global.asax 文件(也称之为 ASP.NET
应用程序文件)是三个可选的文件,该文件包含响应 ASP.NET 或 HTTP
模块引发的应用程序级别事件的代码。
.config:Web.config 文件向它们所在的目录和全数子目录提供配置音信。 
.aspx.resx/.resx:能源文件,能源是在逻辑上由应用程序安排的别的非可举办多少。通过在财富文件中贮存数据,无需另行编译整个应用程序即可更改数据。 
.XSD:XML schema的一种.从DTD,XDR发展到XSD 
.pdb:PDB(程序数据库)文件保持着调节和种类情况信息,从而得以对先后的调剂配置举办增量链接。 
.suo:消除方案用户挑选,记录全数将与缓解方案制造关系的选项,以便在每一次打开时,它都包含您所做的自定义设置。 
.asmx:asmx 文件包蕴 WebService 处理指令,并用作 XML Web services
的可寻址入口点 
.vsdisco(项目发现)文件 基于 XML 的文本,它包涵为 Web
服务提供发现消息的能源的链接 (U大切诺基L)。 
.htc:几个HTML文件,包含脚本和概念组件的一层层小米特定成分.htc提供在剧本中implement组件的体制 

表达:获取运行了应用程序的可执行文件的门道,不包罗可执行文件的名称。常用来WinForm.

以vs2009为列,一些体系性质截图如下:

d)         System.Reflection.Assembly.GetExecutingAssembly().CodeBase

在Command Line中填入,Debug配置下:
copy $(TargetPath)    $(SolutionDir)Bin$(ConfigurationName);
copy $(TargetDir)$(TargetName)d.lib    $(SolutionDir)Lib;
Release配置下:
copy $(TargetPath)    $(SolutionDir)Bin$(ConfigurationName);
copy $(TargetDir)$(TargetName).lib    $(SolutionDir)Lib;
因此要分别安装是因为VC没有表示导入库的宏名字 -_-P
OK,到此结束,你就能够编译ChocolateMilk项目试试是还是不是一切符合规律了,不过请确认拷贝的目的目录事先建立好。

 

 因为,在调节 Visual Studio 二〇一〇 程序时,日常有局部动态链接库(即 dll
文件)供给加载到工程里,那样才能信赖第壹方库进行程序调节和测试。

         假如我们建立3个暗许的vc项目ssyy,他的私下认可“常规“栏目中,“输出目录”为$(SolutionDir)$(ConfigurationName),所以调节和测试时会在缓解方案文件夹下建立三个debug(ConfigurationName的值为debug)文件夹,并在此文件夹下生成 ssyy.lik链接器 和ssyy.exe文件 。默许“中间目录”为$(ConfigurationName),所以会在ssyy项目文件夹下(即ssyy.vcproj的门类安顿文件所在地方)建立三个debug文件夹,并在该公文夹下生成ssyy.obj二进制文件。暗许“链接器”栏目下的“常规”选项下的“输出文件”选项为$(OutDir)$(ProjectName).exe,在那之中$(OutDir)就早已在“常规”栏目标“输出目录”选项赋值了。【由此$(OutDir)的值是在“输出目录”属性中定义的】。

(2)获取和装置当前进行目录

1. 创新霉素A是斩草除根方案目录
2. PureMilk和ChocolateMilk是类别目录
3. Lib目录用于存放导入库可能静态库(包涵第3方库和友好的门类)
4. Include用于存放第3方库的头文件(能够见到第壹方库全体内容分布在Lib、Include和Bin中)
5.
Bin目录存放所有动态链接库和执行档,包蕴团结的出现和第贰方库,区分Release和Debug三个本子。其它,程序运维进度中必要外表的数据文件和运行时需求的安排文件等等都可放于该目录
6.
Temp用于存放近日转移文书,在那之中Compile存放编写翻译器编写翻译时生成的obj文件,Link存放链接器的输出文件。

例如:'”D:ProjectsMyTestbinMyTest.exe”

三 、链接器-》输入-》附加重视项   (此选项是安装程序链接时利用的静态库。也等于链接已经编写翻译好了的“代码”。由此大家能够大致的觉得那些库就一定于大家写的.cpp文件,只但是那么些库是编写翻译好了的.cpp而已)

例如:'”C:Documents and SettingsAdministratorMy Documents”

证实:获取运行了应用程序的可执行文件的不二法门,包罗可执行文件的称谓。

 

表达:获取模块的一体化路径。包涵可执行文件的称号。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图