升级VS2019 16.11.5引起的error CS0246: The type or namespace name ‘FieldDescription’ could not be found (are you missing a using directive or an assembly reference?)

昨晚上看到VS2022的新的Preview版本发布,就连同VS2019一起升级到了最新版。

可没想到的是,我有个项目中的DLL引用就开始编译报错了。

昨晚上弄了几个小时,删掉引用,重新添加也不行。从GitHub上下载老版本同样编译报错。

找同事试了一下,他用的老版本的VS 2019,没有编译问题。

那可以肯定的是我本地VS2019的问题!

于是上午用VS2022打开编译,同样也是报错。

后来我就到Project属性当中看到Reference Path,以前也没关注过这个的。尝试着增加了我外部引用的DLL路径。

你猜怎么着?

没报错了!

我看了一个修改后的GitHub的Git Changes提示也没有,原来这个设置是保存在了csproj.user文件中。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectView>ShowAllFiles</ProjectView>
  </PropertyGroup>
  <PropertyGroup>
    <ReferencePath>E:\Github\DotNet.WangCaiSoft\src\DLL\DotNet\</ReferencePath>
  </PropertyGroup>
</Project>

难道是我的ToolsVersion为Current的缘故?

哪位高手如果碰到类似情况,不让忘记这个error CS0246的报错,看看你的Reference Path增加上是否就解决了。

我还有一个猜测,就是我同时也安装了VS2022预览版的缘故?

.net framework 4.0的NuGet包制作

为啥做这个呢,因为要将公司内部的老的.NET程序所引用的DLL进行统一管理。这里服务端使用了一个叫做NuGetServer(官网:NuGet Server)的开源工具,部署在内部的Web服务器上。

制作NuGet包,我是先从.NET Standard 2.0的SDK风格的文件去创建的,特别容易。但是.NET 4.0这种废了好大周折!

试过直接通过DLL生成,但是会遇到包描述、版本等信息不自动更新的问题,最重要的DLL所引用的NuGet.org的包,不能自动包含进去。

也试过通过命令行进行每个单独的Project进行生成,也遇到包描述、版本等信息不自动更新的问题。NuGet.Org的包没问题。

最后呢使用Tools>External Tools(工具>外部工具)定义了一个命令。

要确保MSBUILD和NUGET好用,需要找到系统环境变量,添加路径(记得重启电脑,以便生效)。

找到Path项
1、增加:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin
2、增加:E:\VS\DotNet.WMS.US\DLL\DotNet

第一个是MSBuild,如果你是VS 2019社区版,直接复制,如果不是,请找到相应的路径。
第二个是NuGet.exe的目录,请选择您自己的目录。

这块设置参考这篇文章:https://www.cnblogs.com/chenug/p/9290281.html

命令:del *.nupkg ; $roj=dir *.csproj ;MSBuild $roj; nuget pack $roj ; $nupkg= dir *.nupkg;
执行目录选择$(ProjectDir)

需要生成的时候,点击一下要生成的Project,然后就可以点击Tools > 4.0NuGet命令

稍等片刻就生成了。

这样生成的包在Project的根目录,但是版本和描述信息呢都不对,请自动修改文件名和文件内部的描述文件内容。

用啥软件打开,7-ZIP即可,因为包就是一个压缩包。

困惑了2年多的C#问题,终于解决了

翻了一下QQ聊天记录,其实这个问题也是困扰吉日嘎拉的问题,2015年我曾经就此问题跟他交流过。

在更新语句中和条件中有相同的参数问题,造成报错:

 The variable name '%.*ls' has already been declared. Variable names must be unique within a query batch or stored procedure.  

曾经我是先判断条件语句,获取到主键ID,然后再根据主键ID为条件进行更新,多了一次数据库读取,折中处理了好几年。

这次再写类似的程序,实在觉得这么搞太费劲,索性花了几个小时,最终的思路就是即便是同名的字段,条件语句的参数自动改名:增加后缀或前缀。

这么一改,条件的参数就自动增加了后缀Where,就跟更新字段的参数不重名了。当然了你也可以自定义自己的后缀或者前缀。

最终时隔2年多,将此更改跟吉日嘎拉再次沟通,也解决了他的困惑,皆大欢喜。

有在用吉日嘎拉底层DotNet.Common数据读写层的朋友,请拿去不谢。

吉日嘎拉DotNet.BusinessV4.2中的一处bug,及我的修复和扩展

bug所在位置:DotNet.Business\Utilities\BaseManager.GetDataTableByPage.cs的函数

public virtual DataTable GetDataTableByPage(out int recordCount, int pageIndex = 0, int pageSize = 20, string sortExpression = null, string sortDire = null, string tableName = null, string conditional = null, IDbDataParameter[] dbParameters = null, string selectField = null)中。当使用自己定义的查询语句作为tableName传递进来的时候,按照逻辑没有使用存储过程进行分页,但是很明显那个传递的conditional和dbParameters都被用来统计了总记录数,但是以下调用语句并没有传递conditional。

return DbLogic.GetDataTableByPage(DbHelper, recordCount, pageIndex, pageSize, tableName, dbParameters, sortExpression, sortDire);

于是我扩展了那个DotNet.Business\Utilities\Extend\DbLogic.GetDataTableByPage.Extend.cs,增加了函数

public static DataTable GetDataTableByPage(IDbHelper dbHelper, int recordCount, int pageIndex, int pageSize, string sqlQuery, string conditional, IDbDataParameter[] dbParameters, string sortExpression = null, string sortDire = null)

这里的逻辑是,多表查询构造一个viewTable,然后将where查询直接传递到viewTable里面,而不受分页的影响。上个月扩展了此函数,今天正式升级服务器程序的时候,还是出现了问题,于是有了以上函数的完善版本。上个月是将where条件放在了最外面,造成ROW_NUMBER范围内的所有记录都没有指定where条件的记录,造成用户看记录的时候明明有,显示不出来。当然,这个扩展的函数仅仅是扩展了MSSQL的数据库,有类似使用的朋友可以参考。

吉日嘎拉C#快速开发平台V4.0到V4.2升级记

目前我用的版本是4.0的,也有近2年没更新了,狠了狠心升级一下,没想到真的行动起来,也没那么难!

用了3天时间,将吉日嘎拉的代码升级到了4.2版本,并让原来的DotNet.WebApplication正常运行起来,比料想的顺利。这里简单记录一下升级中的心得。

使用到的工具:

1、BeyondCompare 试用版 – 比较程序文件

2、SQLDelta 14天试用版 – 比较数据库表结构变化(及数据变化)

3、VS2010 – 保证升级后WebApplication好用

4、MSSQL 2008 R2 – 标配数据库

最新代码的亮点:

1、分离出了DotNet.Model

2、分离出来DotNet.IService

3、DotNet.Business新增Redis缓存

4、DotNet.Utilities新增众多BaseSystemInfo参数和底层函数:数据库读写分离等

5、新增DotNet.UserCenter,用于其它程序如WebApp、安卓、苹果端调用

6、用户登录日志表完善、强大

7、数据库访问增加跟踪及底层文本日志

8、增加DotNet.MVC项目,BS端的用户及权限管理(还未研究)

相关截图:

1、数据库UserCenter更新

2、项目及解决方案截图

注意事项:

1、SqlDelta生成部署的代码后,还需要手动更新老记录中一些字段的值

UPDATE [UserCenterV40].[dbo].[BaseUser]
SET IsAdministrator=1,UserName='Administrator',NickName='Administrator'
WHERE UserName='Admin'
UPDATE BaseModule SET AuthorizedDays=0
UPDATE BaseUserLogOn SET OpenIdTimeout = GETDATE() 
UPDATE BaseUserContact SET MobileVerificationDate = GETDATE()

2、DotNet.WebApplication中有很多登录及读取权限的函数需要更新BaseSystemInfo.SystemCode

本文是升级记录的第1篇,后继会继续记录研究DotNet.MVC项目后的心得,敬请期待。

后记:请大家不要问我要源码,如需购买请直接联系吉日嘎拉,他的博客园的主页地址:http://www.cnblogs.com/jirigala/