VS编译时发生错误:必须添加对程序集 netstandard, Version=2.0.0.0 的引用、调用的目标发生了异常、error occurred in document statechange handler

我用的是比较古老的VS版本,今天在添加了几个包之后,发现编译时会引发 bc30652 错误,提示 “必须添加对程序集 netstandard 的引用”。

netstandard 本就应该集成在工程文件的引用之内,可能是因为我用的VS版本比较老,所以默认的工程模板并没有自动引用。
但是我自己添加引用时,发现根本搜不到 netstandard 的类库,自己去 nuget 下一个新版本的 netstandard ,引用后又发现版本对不上,引发了更多的错误……

最后搜索半天,终于发现了解决办法,而且还非常搞笑。
我们只需要手动修改工程文档的 vbproj 或者 csproj 文件,在 ItemGroup 节点添加一个 netstandard 的引用即可:

<ItemGroup>
    <Reference Include="netstandard" />
    <!-- 其他引用 -->
</ItemGroup>
修改完成后,让VS重新加载工程,编译——成功运行……
还是那句话——SB微软!!!

- 阅读全文 -

.NET 程序设置单独的“文件版本”与“产品版本”

.NET 可以在工程属性中设置“程序集版本”与“文件版本”两种版本信息。
其中 程序集版本 不会应用到编译后的程序或是类库的文件右键属性的详细信息当中,仅用于.NET自己的运行环境中。

另一个属性“文件版本”则是会嵌入到文件属性面板中,也可以被系统API调用,只不过默认的.NET工程会将该数据同时应用到“文件版本”与“产品版本”这两个项目当中。

如果你需要分别设置这两个版本号,则可以在 AssemblyInfo.vb 或是 AssemblyInfo.cs 中添加一个参数:

- 阅读全文 -

运行时设置.NET类库与Win类库位置



虽然目前32位操作系统的用户已经很少了,但若是你的程序需要兼容x86系统,可以参考一下本文。

首先,.NET 的类库是可以同时兼容x86和x64系统的(编译选项中设置目标CPU为AnyCPU),只要你的类库不包含任何本地代码(C、C++等)、或者针对特定系统的代码。

如果你的程序调用了第三方的类库,并且只能提供 x86\x64 两个版本的话,就需要在执行时设置类库文件的位置。

- 阅读全文 -

.NET 中的可空值类型

在 .NET 中,有引用类型与值类型两种对象类型,而其中值类型是“不可空”的类型,比如你设定一个int i = null,那么它会使用默认值0来为自己赋值。
然而有些时候,我们需要一个可空的值类型(比如数据库中的可空字段),那么该怎么办呢?

- 阅读全文 -

.NET 中的联合体

在C++中,有一种类型名为联合体(亦称共用体),关键字为union,它与结构十分类似,但是它所有的数值全都指向同一个指针。也就是说,当你修改联合体内的某一个数据时,其他数据也会同时改变。
这个类型的好处,在于可以存储某种不确定的数据对象,等到稍后再来分析出该对象的用途。

union MyUnion
{
    char b; //单字节整数,在c语言中用char类型来表示单字节整数
    short s; //双字节整数
    int i; //四字节整数
}
而在 .NET 中,却并没有 union 这个关键字,是不是 .NET 就无法使用联合体呢?
当然不是,否则我干嘛写这篇文章?!

- 阅读全文 -

.NET 4.0框架下的Base64字符转换存在BUG

如果有一个双等号结尾的非法BASE64编码作为参数(如abc==),.NET的 Convert.FromBase64String 函数不仅不会报错,反而还会产生一个意料之外的返回值,对后续程序的执行是一个隐患。
详细资料请参考 https://detunized.net/posts/2019-03-06-base64-decoding-bug-that-is-present-in-all-version-of-.net/

经过我个人的测试,我发现这个BUG仅影响 4.0 以上的版本,反而 2.0~3.5 可以正确发现参数异常,并予以报错。
另外据说最新的 .NET Core 也已经修复了这个BUG,所以请使用 4.0 作为开发框架的童鞋们“注意安全”。

原文给出了一个 .NET 4.7.2 的内部解决方法

// This only works for base64 without spaces or linebreaks.
string Repad(string base64)
{
    var l = base64.Length;
    return l % 4 == 1 && base64[l - 1] == '='
        ? base64.Substring(0, l - 1)
        : base64;
}
不过总觉得哪里有一点不对劲,哈哈~

- 阅读全文 -

动态执行 VB.NET 和 C# 代码

有时候我们需要尝试动态地与一些代码进行交互,而不是只能执行程序内已编死的代码,那该怎么办呢?
我首先推荐各种脚本语言,如Javascript、Lua、Python等等,这些脚本语言有很多优秀的第三方类库,可以很方便的与 .NET 系统集成,让我们的程序中执行动态代码。

但如果你一定想用VB.NET或者C#的代码来运行一段程序,这里就要用到动态编译的功能了。

- 阅读全文 -

將頁面轉換爲繁體

Google Translate

公告

欢迎您光临鄙人的小站,虽然没什么太专业的东西,不过如果本站的文章能让您有所收获、或者仅仅是博您一笑,那么也不枉费我建站的辛苦了!

您可以使用邮件订阅来获得邮件更新提醒。

瞎哔哔

    服务器后台更新,已使用了服务商内置的CDN,缓解最近老是断连的问题。

  • 查看更多...

最新文章

随机文章

最近回复

分类

标签