【无私分享:从入门到了解ASP.NET MVC】从0起先,一起多框架、做项目 (16)源码分享二:登录效能跟UI、数据库、仓储源码分享起名

b)         System.Environment.CurrentDirectory  

单点登录

 

  假诺只是操作系统验证通过,我们检测一下部署文件是否被了单点登录:单点登录的落实情势实在很是简短,这里大概与我们说一下思路

  首先,我们出个用户在线状态表
UserOnlie

  起名 1

  当我们制造用户的时段,这里也会面创设一个 一针对一
底用户在线状态记录。

  大家以极其外层的后台主页面中,有只 SignalR-Hubs
,也是暨其间聊天室一体的,当用户登录后要又连接时,我们即使更新用户之在线状态:

  起名 2

  当用户离线时,大家立异用户之在线状态也离线:

  起名 3

 

  通过此大概的点子,很简陋的实现单用户登录形式。

 

 

  OK,这样中央的手续就是完了,假设用户不在线或无拉开单用户登录,那么大家记录Session和库克(Cook)ies,倘若被了单用户格局,并且用户已在线,那么大家登录败北,提醒当前用户,用户既报到

  json.Msg =
“当前用户既登录,系统不允许再登录!登录IP:” +
UserOnline.UserIP;

 

  那一个Login方法大家可修改部分串行的点子也异步并行,提升功效。登录页的UI
在前的随笔和本文顶部 已经让我们大饱眼福,源码
在眼前的稿子中也暴发,然而没出席单点登录,这一个是后来长的,这里再次为大家贴一下完好的登录控制器:

  

起名 4起名 5

  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. GMA是解决方案目录
2. PureMilk跟ChocolateMilk是路目录
3. Lib目录用于存放导入库或者静态库(包括第三方库和投机之类型)
4. Include用于存放第三方库的条文件(能够视第三方库所有内容分布在Lib、Include和Bin中)
5.
Bin目录存放所有动态链接库和执行档,包括好的产出与老三方库,区分Release和Debug两单版。此外,程序运行过程遭到得外表的数据文件和开行时需之布置文件等等都但是放于该目录
6.
Temp用来存放临时变卦文书,其中Compile存放编译器编译时其它obj文件,Link存放链接器的出口文件。

索引

 

  

证实:获取模块的圆路径。包括可执行文件的称谓。

前言

  

  前边还从来不下载至UI和数据库的,这里又让我们提供一下:百度网盘
 提取码:fuuv
,UI是参照H+,可是H+是收费授权的(¥998RMB),价格起接触贵,所以 我们的 UI
跟H+ 即使是一个品格,可是我们可见见,CSS基本用的如故Bootstrap,JS
基本依然 最新的开源插件与自己还写的,不有版权问题。

 

  我们眼前一模一样段就再也写了俺们的囤类,著作被接口都已排有,实现类似为说之良通晓,引入
uow 后,我们修改一下本来的交,就好。然而过多有情人 总感到
不被你文件 是因 有些东西没松开吃您,那么 就重新于我们 下载一下
我之囤,大家可比一下,是休是博客中故意少几东西。修改后底仓储:百度网盘
提取码:qw64 

实际,只是记挂叫我们温馨出手一下,修改章程分外粗略,就是将咱前的艺术加上个标准化:
bool
IsCommit=true,当大家唯有举办同样项操作的时段,默认直接提交,当我们举办多起操作的时节,可以传false,不交付,然后经uow
统一交由。我们可以看一下,使用的例子:

  起名 6

 

 

出于点叙述可以总括发生,管理器(解决方案或项目)都会晤相应一个总的文本夹,这些管理器文件夹下存放本管理器的部署文件和子管理器。比如,解决方案是单管理器,它的文书夹下含有.sln配置文件及子管理器ssyy项目和子管理器ssyy2项目。

登录

  该正事了

  登录控制器
/Areas/SysManage/AccountController,一共来一个视图,两独艺术:登录页面、登录验证、验证码。

  起名 7

  

  首先,我们是控制器和区域里其他控制器的一个组别就是,大家从没继续
BaseController,我们可看下大家的
BaseController
都关涉了几什么:

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

  ②
用户对象:网站后台的指挥者,大家第一从Session中得用户,要是Session
失效,那么我们于Cookies中取用户音信,模拟登录重新赋值 Session
并赢得用户,假设Cookies也失效,那么又登录。

  ③
邮箱域名:这多少个是中间邮件之所以底,我们这边并非。

  ④ 登录验证

  ⑤ log4net日志封装方法

  ⑥ 输出音讯

  ⑦
模块权限验证:大家对每一个模块都爆发单独的权力,并且监控Action和Method,在头里我们早就形成了针对模块权限的起先化和从定义权限扩张,这里我们即使需证实时用户,对这模块的Action
是否来相应的操作权限(例如:添加、修改、删除、列表以及由定义之诸如
审核、打印、下载等),并且输出权限到视图,同时在视图页对没有对应权限的按钮Remove掉。通俗的摆,就是大家Remove掉视图页中莫权限的按钮,并且监控后台Action的操作,所以虽然你协调上加上相应的按钮和道,提交至后台时为无会见经过验证。

  起名 8

 

  通过地点详细的说,大家得以窥见,登录页是休需要这个的,不过后台操作的别控制器都得,所以其还无冕了BaseController
可是,登录控制器不待。

 

  我们再一次回头看大家的AccountController:

 

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

 

  我们来拘禁下登录验证办法:

 

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

  然后,大家透过用户输入的账号和密码验证用户,这里,我们因而匹配账号及密码归用户的实体类 var users =
UserManage.UserLogin(item.ACCOUNT.Trim(),
item.PASSWORD.Trim());

  值得注意的是:因为我们由此底加密算法是动态密钥的,所以本着平之字符串每趟加密后底密文都是休等同的,因而我们无可知经过对用户输入的密码举行加密后与数码匹配,而是经过账号取出密码,对密码举办解密和用户输入匹配的模式表明:

  起名 9

  

  假如回到正常,我们先是还要表明用户是否给禁止登录:

  起名 10

  

  倘使及时同一步验证也透过,我们由此 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     }

 

  这一个仿佛里含有了用户的主旨音讯以及可操作的网、模块和对应的权力音信。

 

 
 下一样步,大家事先来表明一下,用户可操作的系统(这里起名有些误导了,应该叫Systems,System_Id给丁之记念是系统ID,而休是系集合): if
(acconut.System_Id.Count > 0)

  

 

例如:'”D:ProjectsMyTestbinMyTest.exe”

 

sln:解决方案文件,为缓解方案资源管理器提供展示管理文件的图片接口所欲的信息。 
.csproj:项目文件,创立应用程序所急需的援、数据连接、文件夹和文书之信息。 
.aspx:Web
窗体页由少数部分组成:视觉元素(HTML、服务器控件和静态文本)和该页的编程逻辑。Visual
Studio 将即时点儿个组成部分分别存储于一个独立的文件被。视觉元素在.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
服务提供发现信息之资源的链接 (URL)。 
.htc:一个HTML文件,包含脚本和定义组件的同层层HUAWEI特定元素.htc提供于本子中implement组件的体制 

卖源码?

 

  很多爱人还当牢骚,说博主终于依然商业化了…

 

  首先为,到目前截至,我无卖同学源码,假若您于我们的互换群里,你可问问大家,很多私聊自己打源码的爱侣,我都是和她俩说先随和讯的著作好进行,学会才是目标,单纯的源代码是未曾外意义之,乐乎贴出底源码跟我种受到源码的唯一区别就是是,我种被之源码没有注释,实在可怜再来探寻我。

 

  第二为,有些源码出售网站惊现
果冻博客源码…
这为自家死受惊,首先是叫宠若惊,巧合的凡,有只源码网站是自个儿爱人之,要无是他发放自己自身还真不知道,我是未反对这种作为之,你学会了即是若的,卖依然未发售是公的从业,不过扒下来的代码,都没经测试,这么多错误,都跑不起来,就拿来出售,是老无好好的。

 

  第三为,我面说过了,和讯贴发的源码
跟我源码的绝无仅有区别就是,我种中源码是从未有过如此多注释的。即便只是是分开享源代码,大得停放GitHub上,难道一步一步贴出源代码不就是享受源码,只有把完整的自独包发给每个人才为享受源码吗?这知乎的意思是?博客园不是GitHub,两个站的指标是无等同的。对于同一是新手的本人来说,github上的纯粹的源代码,假使ReadMe
写的莫详细,是挺难看懂的,更不要说知道使了,假诺同篇一篇稿子,一步一步说,一漫长一漫漫注释,然后贴起完全的,都无法亮的话,直接一个圆的源码就能看理解也?

 

  伤不起。。。

 

 

 

 

【无私分享:从入门到了然ASP.NET MVC】从0最先,一起多框架、做项目 目录索引

  

 

b)         System.AppDomain.CurrentDomain.BaseDirectory

证实:获取应用程序的当下工作目录的毕限定路径。该法是指向Win32
API的GetCurrentDirectory函数的一个包。

(1)获取与安装当前工作目录

脚举一个基本上门类例子(vc++例子):(转自:http://blog.163.com/zhang_bo1983/blog/static/16992223020123753334981/

 

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

达图备受,假诺项目名称为ss,则总是器生成的exe为图被所突显目录下的ss-YY-.exe文件。一般的话是文件之位置与称号要与地方所陈述之“命令”选项相同,以象征链接器生成的公文和调试时使用的文件一律。(注意调试时虽然没修改源代码操作,单击调试按钮后,为了加速调试速度,并无相会指向先后还链接,也即不汇合启动链接器)

例如:'”D:ProjectsMyTestbin”

最终说一下,在开发过程中,究竟咋样来给 Visual Studio 链接这么些 lib 及
dll 文件会较好啊?

 

(2)获取和装置当前举办目录

 “调试”栏目中的“命令(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),此时调试器就足以正常调试通过。

经过自身做过之有的尝试求证,假诺就通过链接器生成了exe文件,手动修改是exe文件称,调试时如用齐图所著之取舍的文本称也进展对应的改动,一样可进行调试并启动exe程序。

不言而喻,c#系列默认生成的文件目录结构还客观,且输出的exe位于总项目文件夹内,而c++项目默认exe位于解决方案总文件夹下。其它c#还客观在,C#选择Bin目录,在Bin目录下涵debug和release两单目录,而C++不行使Bin目录,间接用debug和releae五只目录。

表明:获取或安装包含该应用程序的目录的名目。重回路径末尾带“”

 

先是,解决方案以及连串文件夹包含关系(c++项目):

【同样于调节选项下的和劳作目录选项同一流的挑三拣四项“命令”选项是安,使用调试时,从乌启动exe文件,因为一般生成的exe放在bin目录下的debug或release目录下,所以命令选项一般也“Bin$(Configuration)$(ProjectName).exe”,默认为是其一价值,当然可以更改,但此刻代表调试状态下启动的exe为“命令”选项中装置的exe文件,而休是默认的bin目录下的debug或release下之exe文件了。最终说一下,下边所说的“调试”是乘vs下启动exe,包括debug格局与release格局,不要管调试就领会也才发debug情势。】

VS解决方案及一一品种文件夹和缓解方案以及顺序档次相应的布置文件包含关系,假而新建一个列ssyy,解决方案于名fangan,注意解决方案包括项目,此时其它尽外层目录也fangan代表全解决方案的内容还于是文件夹内。在是fangan文件夹内包含有fangan.sln的解决方案安排文件以及一个ssyy文件夹,ssyy文件夹代表所有ssyy项目标有所情节都于斯文件夹内,这些文件夹内涵盖ssyy.vcproj的型安排文件以及.h头文件以及.cpp源文件。如若在fangan解决方案下还建一个初类型名为也ssyy2,则会当fangan文件夹下殊成一个ssyy2文件夹存放ssyy2项目之所有情节。

俺们的要求是分明的,不过VC
2008(VS2008)并无相会自动吗大家做好位置有的事务。可是我们并不需要编写复杂的编译脚本(makefile),只需要简单的改动项目之缺省设置即可。
咱得VC(VS)为咱们举办的业务包括:
1.以“/GMA/Temp/Compile/”作为项目编译时以的中间目录
2.下“/GMA/Temp/Link/”作为项目链接的输出目录
3.当型是应用程序时,在构建了后拷贝执行文书及“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,当型是动态链接库时,除了拷贝dll到Bin,还拷贝导入库到“/GMA/Lib/”
4.当色是应用程序时,调试时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”上边的行文书,并坐“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”为办事目录
率先看一下型设置中可利用的偌大,常用之来:

 

只要尽管C++项目,则解决方案总文件夹下就特含有解决方案安排文件sln和一个种总文件夹和一个Debug文件夹和一个Release文件夹(共三只东东,其中Debug和Release文件夹着存放最终生成的结果exe或dll,要留心要未动Release生成,则未存Release文件夹),而路总文件夹下涵C++源文件头文件、项目布局文件及一个Debug文件夹和一个Release文件夹(一定要留意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的事物。借使无行使Release编译,则尚未对号入座之Release文件夹)。

例如:'”D:ProjectsMyTestbinMyTest.exe”

#pragma
comment(lib,”..\debug\TestLib.lib”);其中的倒斜杠要就此对倒斜杠,因为它是次解释的对引号包括的字符串,需要转义一下,要分别include,#include
“..TestVideoApplication.h”中连无是出于程序解释的字符串,所以不用转义。

 

例如:'”D:ProjectsMyTestbinMyTest.exe”

老二、链接器-》常规-》输出文件  (表示链接器生成的exe文件在哪以及变更的exe文件名称)起名 11

“链接器”栏目下的“输入”选项下之“附加看重项”项。此桩是安装程序链接时行使的静态库。分外给链接已编译好了的“代码”。因而我们好略的当这个库就一定给我们团结一心写的.cpp文件,只不过那多少个库是编译好了之.cpp而曾经(那里仅需要库名称即可,搜索路径在此外地点设置)。

起名 12

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

世家可因项目的实际情状,灵活采纳以上措施。

 

对工作目录的补:vs中行事目录的装是受调试用底,也便你启动调试后,启动一个初过程,自动将这新进程的劳作目录设置也vs项目性质被之干活目录,然后新过程启动相应的exe程序。但是要非以vs的调节启动exe,而是一贯双击exe文件启动一个新历程时,会自动将这个新进程的劳作目录设置为exe文件所在的目,这是暨vs启动调试不同的地点。所以如果发布之时节不将工作目录内的东西拷到exe所于的目外,就汇合运作出错,因为这做事目录不再是vs中安的了,而是exe文件所在的目录。最终,说一下,vs中默认的vc++工程的做事目录项目标值是空的,代表默认是vs工程所在目录即.vcproj文件所在目录,c#工程默认没测试,估摸与vc的同。】

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

 

 

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

  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 里。

 

 

        其余,经过实际测试,发现“输出目录”属性只可以从至对$(OutDir)系统变量赋值的图,和“改变生成的.exe文件存放地方”没其他涉及。也就是说,假如“输出目录”中安的$(OutDir)值当C盘,而“输出文件”中安装输出文件的岗位吗D盘,最后生成的exe文件会于D盘,“输出文件”属性才决定输出exe文件之地点。

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

b)         System.Windows.Forms.Application.ExecutablePath

连下大家安应用程序项目PureMilk:
1.使用“/GMA/Temp/Compile/”作为项目编译时行使的中游目录
2.利用“/GMA/Temp/Link/”作为项目链接的输出目录
首先将配置改成All
Configuration(全体配置),这样可以让咱又修改Debug和Release的部分;
Output Directory(输出目录,链接器)栏位填入:
$(SolutionDir)TempLink$(ProjectName)$(ConfigurationName)
Intermediate Directory(中间目录,编译器)栏位填入:
$(SolutionDir)TempCompile$(ProjectName)$(ConfigurationName)
3.构建了后拷贝执行文书及“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”
在Command Line中填入,All配置下:
copy $(TargetPath)    $(SolutionDir)Bin$(ConfigurationName);
4.调节时运行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下边的执行文书,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”为工作目录
起名 13

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

缓解方案以及品种:
自从VC6之后VC连串就是用解决方案(Solution)来代表原先的做事空间,用于社团以及保管大多单有关的路(Project)。
随笔首先演示一个虚构的化解方案与大家盼望获取的目结构,然后选取VC2008底品类安装效能来平等步一步上我们的需。
虚拟解决方案:
欠虚拟解决方案名也GMA,包含一个动态链接库项目ChocolateMilk和一个应用程序项目PureMilk,需要选拔一个老三正值库log4cxx(Apache
log4j的C++移植版本,用于日志输出)。【注意这些例子中ChocolateMilk项目唯有可怜成一个dll,PureMilk只生成一个exe】
log4cxx是以动态库的法门编译的,所以我们用其的3种东西,分别是条文件,导入库(log4cxx.lib,
log4cxxd.lib)和动态链接库(log4cxx.dll)。
苟我们想的目录结构要下图:

附:*.ascx *.asax *.aspx.resx
*.asax.resx是什么文件

VC可以吃咱装构建前后执行的脚本程序,所以为了完成3,
咱需要写构建后执行之台本:
起名 14

附2:vs(紧假使.Net)中常用之各个类型的公文:

证实:获取启动了应用程序的可执行文件的路径,不包括可执行文件的名号。常用来WinForm.

讲明:即便含有清单的曾加载文件没有给形象复制,则取该公文之基本代码格式的岗位。

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

“附加倚重性的安装”等同于在代码中形容“#pragma comment(lib, “库名称.lib”)
”语句子,假使接纳相对路径则如下:

其三、链接器-》输入-》附加依赖项   (此选项是安程序链接时选用的静态库。至极给链接已编译好了之“代码”。因而我们得以简简单单的当这一个库就分外给大家刻画的.cpp文件,只但是这一个库是编译好了底.cpp而已经)

a)          System.IO.Directory.GetCurrentDirectory()

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

 

顾高亮的一对,首先将配备改成All
Configuration(全部部署),这样可以吃我们以修改Debug和Release的组成部分;
Output Directory(输出目录,链接器)栏位填入:
$(SolutionDir)TempLink$(ProjectName)$(ConfigurationName)
Intermediate Directory(中间目录,编译器)栏位填入:
$(SolutionDir)TempCompile$(ProjectName)$(ConfigurationName)
3.构建了晚拷贝动态链接库到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷贝导入库到“/GMA/Lib/”【这是坐一旦无设置,此时变化的dll和lib都以点安装的输出目录中】
俺们平常都会师在Debug版本的输出库前边长字母“d”以代表这是Debug版本,在Debug配置下,修改Import
Library
栏位:
起名 15

除此以外,默认情况下,项目性质设置的目起源为项目配置文件所在地点,实际上就是路头文件以及根源文件所在地点。

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

.css 样式表文件

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

而达到图设置,借使项目名称为ss,则TargetName系统变量的价值就是ss,TargetExt是扩充名为exe,此时单击调试按钮(vs中之不得了小三角形按钮),会于动图中所著目录下的ss-XX-.exe文件。

证:获取基目录,它由程序集顶牛解决程序用来探测程序集。再次回到路径末尾带“”

下图是某个一个工具有安装的例子:

下开首举行所举事例的工安装:

率先来设置ChocolateMilk:
1.拔取“/GMA/Temp/Compile/”作为项目编译时用的中目录
2.利用“/GMA/Temp/Link/”作为项目链接的输出目录
起名 16

 

留意:调试栏目下之兼具选项都是为了调节服务的,假使无用调试按钮,这多少个选用就不起效用。至于VC++目录以及C/C++栏目是于编译器起功能的,无法是喻编译器在何寻找头文件、库文件之类的事体,或者设置任何部分编译器选项,此不赘述。

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

Command栏位填入:$(SolutionDir)Bin$(ConfigurationName)$(TargetFileName)
Working Directory栏位填入:$(SolutionDir)Bin$(ConfigurationName)
这般就是很功告成了,现在若固然好编译该实施顺序并开展调剂。

一、调试-》命令

7.PureMilk跟ChocoliteMilk三个序列的头文件和来文件地点不要动,任然在独家的项目文件夹内。
地点目录结构清晰,一面精晓,当我们的程序用打造安装包或一旦从包源码
公布的时候,它能使大家生活变得重复易^_^
制作设置包时我们只需要以“/GMA/Bin/Release/”目录下之所有文件包。
发布和更换源码的下大家可打包除了Temp目录以外“/GMA/”下面的备文件及目录(假设未待执行档,也只是免包括Bin)。

起名 17
顾:从上图可以见到,TargetDir指目标目录,是一个目录。而TargetPath是目的路径,包括具体的文本称

另常用的性质还有,“调试”栏目中之“工作目录”项,那一个特性默认意况下是拖欠的,但表示工作目录是工程目录,也不怕是工程安排文件ssyy.vcproj所当目。工作目录表示举行某项操作的目标目录,会随着OpenFileDialog、SaveFileDialog等目的所规定的目录而改变。“办事目录”属性效率是程序运行后唯一识其余默认目录,即工作晚仅仅认得那目录,工作目录者名字描述的就大形象,(可以以所依靠之lib和dll库文件所在目录设为办事目录,但貌似是管lib放在解决方案下之Lib目录中,把dll放在解决方案下的Bin目录中),例如程序运行过程中生成一个txt文本文件,假若以开立文件过程遭到未指定相对路径,只指定创制文件之公文称,那么这文件文件默认就会见树立以办事目录中,当然读取一些部署文件呢当劳作目录中找,但若表明一下,生成的exe文件和工作目录没任何涉及,也非会师在工作目录中。总的来说,工作目录就是程序运行过程被默认读取的目录。对于dll,淌倘诺程序运行前纵进来外存有点像静态链接这样,此时dll就好推广入exe所当的行目录,要是dll是运行中动态加载的貌似位于工作目录,比如插件就是在工作目录。即工作目录就运行中唯一可以辨识的默认目录,工作目录在代码中因故GetCurrentDirectory之类的函数获取,具体代码间最下的附1。工作目录及执行目录可以不同,例如一个人住在香港市,但他的办事地点不自然在京都,可能在巴拿马城。

         假诺我们树立一个默认的vc项目ssyy,他的默认“常规“栏目中,“输出目录”为$(SolutionDir)$(ConfigurationName),所以调试时会合当解决方案文件夹下起一个debug(ConfigurationName的价也debug)文件夹,并于此文件夹下生成 ssyy.lik链接器 和ssyy.exe文件 。默认“中间目录”为$(ConfigurationName),所以会以ssyy项目文件夹下(即ssyy.vcproj的连串布局文件所在地方)建立一个debug文件夹,并于拖欠公文夹下生成ssyy.obj二进制文件。默认“链接器”栏目下之“常规”选项下之“输出文件”选项也$(OutDir)$(ProjectName).exe,其中$(OutDir)就既于“常规”栏目的“输出目录”选项赋值了。【就此$(OutDir)的价值是当“输出目录”属性被定义之】。

 

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

 

 

a)          System.Windows.Forms.Application.StartupPath

        下面两截说了这么多,总计就是是,默认境况下“输出目录”和“输出文件”三个特性对应的目录是一致的,这样用正在好(当然,输出文件的价在输出目录的值的根底及还富含有exe文件称)。假如少单不同等,则中生成的链接器用之如xx.ilk和xx.pdb文件等以输出目录,而结尾生成的xx.exe文件于“输出文件”属性设置的目录中。

襄助,常用色性质与网布局变量关系:

 

这一个动态链接库,往往依然测试版本或是开发中之本子,或者会出好多独版;这一个时,即使直接把
dll 所在目录加到 PATH 里,则会暴发私房争辩之危险;假设直接拷贝到 Visual
Studio
的目录下,即使测试工程太多,每便出新本子的动态链接库更新时,你待改进若干潮,拷贝、粘贴苦不堪言。

例如:'”D:ProjectsMyTestbin”

证:获取最初指定的主次集的职务,例如,在AssemblyName对象被指定的职位。

c)          System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase

 

例如:'”D:ProjectsMyTestbin”

 

        而$(TargetDir)的值是当生成exe文件后自动赋予值为exe文件所在地点。所以可以说,“输出文件”最后决定exe文件所在的地方,也最后决定了$(TargetDir)的价值,$(TargetPath)和$(TargetDir)的行事是接近之,此不赘述。

因vs2010为列,一些品类性质截图如下:

 

起名 18

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

 

完上吧,有几乎栽办法可变动 Visual Studio 的环境变量设置:

 因为,在调节 Visual Studio 2008 程序时,平日闹一部分动态链接库(即 dll
文件)需要加载到工程里,这样才可以凭第三正值库开展程序调试。

起名 19

除此以外,下面两段子话可总计出,当调试程序时,系统变量$(OutDir)的价是处女确定的,而$(TargetDir)和$(TargetPath)的价值是当exe文件生成后才确定的。也就是说系统变量$(OutDir)的值由VS项目之“输出目录”属性决定,而$(TargetDir)和$(TargetPath)的值由VS项目之“输出文件”属性决定。即设置了VS的“输出目录”属性就一定给安了$(OutDir)的价值,“输出目录”是界面上的唤起用于吸纳用户输入的部署音信,然后拿此具体的布局音讯存入系统内容之变量$(OutDir)中。

(3)获取和装置当前施行目录,包括可执行文件名

上:vs中确立默认的C#品种和建立默认的C++项目转移的目结构是勿一样的。即便是C#列,则解决方案总文件夹下就是独自含解决方案安排文件sln和一个品类总文件夹(共少单东东),而路总文件夹下涵c#出自文件、项目布局文件proj、一个Properties属性文件夹、一个obj文件夹和一个bin文件夹,其中obj和bin文件夹下还包含debug和release六只文件夹。obj文件夹下存放中间编译结果(扩张名更加项目项目而各异),而bin文件夹下存放最后生成的结果(扩充名类同为exe或dll)。

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

在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项目试试是休是一切正常了,不过请确认拷贝的目的目录事先建立好。

 

 

讲明:获取指定路线字符串的相对路径。也堪用GetFullPath(“.”),GetFullPath(“.\”)

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

证:获取启动了应用程序的可执行文件的路子,包括可执行文件的号。

发表评论

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

网站地图xml地图