Kvaser 的CANlib C# 包装器已添加到.NET Standard。在本文中,我介绍在使用对 “.NET CORE” 和 “.NET Framework” 都适用的NET Standard 2.0. 创建一个C#项目时,如何在Visual Studio 2019中激活CANlib。在现有项目中,也可以使用此文档激活CANlib。
新闻资讯
使用CANlib Visual Studio 2019 C# .NET STANDARD 2.0
VS, VS2019, Visual Studio 2019, C# ,dotNET, CORE, netstandard2, x86, x64, win32, win64, anyCPU, dll, CANlib, canlibCLSNET, KVASER
作者: Lars-Göran Fredriksson, 现场应用工程师, Kvaser AB
版本: 2019-12-04
本文是基于博客: Using CANlib Visual Studio 2017 C#.NET.
本文已为“Visual Studio 2019”进行了修订,现在展示如何使用 “.NET Standard 2.0” 框架(及更新版本)。
本文使用的缩写:
VS2019 Microsoft Visual Studio 2019 (C# .NET)
CANlib Kvaser CANlib SDK
在开始之前...
首先,我们必须下载并安装“Kvaser CANlib SDK”和“Kvaser Windows驱动程序”。
在安装CANlib之后,请检查Kvaser CANlib“netstandard2.0”的安装位置。
在我的64位Windows计算机上,它们安装在这里:
-
c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\
-
c:\Program Files (x86)\Kvaser\Canlib\dotnet\x64\netstandard2.0\
请记住它们的位置,因为你很快就会需要这些信息。
如果你要创建一个支持 “.NET Framework 4.6” 或更旧版本的应用,你需要使用 “canlibCLSNET.DLL”。此链接上的博客解释了如何使用 “canlibCLSNET.DLL”: Using CANlib Visual Studio 2017 C#.NET
如果你已经完成这一步,那么还需要安装 “Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019”。 (这将自动安装,如果你在安装VS2019时安装了C++工具。)
现在我们已准备好开始Visual Studio 2019 (C#)。
1.创建一个空项目
可以用许多不同的方法在VS中创建一个项目;这是其中一种方法。
点击 “File” – “New” -”Project…”
创建一个 “.NET Core” 或 “.NET Framework” 项目。
编辑名称和其他信息,然后点击 “OK”。
VS2019 现在为我们创建了一个应用程序。
它看上去无趣,只是一个空框架,什么都不能做。
2.添加一个使用 CANlib (C#)的编码
我们现在将添加一个使用CANlib的代码;在本例中,此代码能做什么并不重要。有关如何使用CANlib的更多信息,请参见CANlib SDK Help。
2.1 Windows窗体设计器
此信息在2019年11月15日有效。
这是来自微软的信息:
因为这是此设计器的第一次预览,所以它还没有与Visual Studio捆绑在一起,而是作为Visual Studio扩展(“VSIX”)(download)提供。这意味着,如果在Visual Studio中打开一个针对.NET Core的Windows窗体项目,默认情况下它将没有设计器支持–你需要首先安装. .NET Core设计器!
你可以在此处阅读该文章全文:
2.2编辑该窗体
要添加一个按钮(BUTTON)和一个文本框(TEXTBOX),把文本框上的 “Multiline” 属性改为true。 (我考虑你会熟悉怎么在VS2019中添加部件,所以我不在此处演示)。
你可以在这里看到很多信息:
稍微编辑之后,我们得到了一个精致的应用:
4.2 编辑代码
它仍然什么也不能做,所以在编辑器中,双击“button1”,并在 “button1_Click” 函数中添加一些代码。
private void button1_Click(object sender, EventArgs e)
{
Canlib.canStatus R;
int V;
textBox1.Clear();
textBox1.Text = "DEMO VS2019\r\n";
Canlib.canInitializeLibrary();
V = Canlib.canGetVersionEx(Canlib.canVERSION_CANLIB32_PRODVER32);
int V1 = (V & 0xFF0000) >> 16;
int V2 = (V & 0xFF00) >> 8;
textBox1.Text += string.Format("Found CANlib version {0}.{1}\r\n",V1,V2 );
R = Canlib.canGetNumberOfChannels(out int NOC);
textBox1.Text += string.Format("Found {0} channels\r\n", NOC);
textBox1.Text += "----------------------------------------\r\n";
}
当我试运行此应用时,会得到多个错误。由于VS2019找不到CANlib,所以出现了问题。
3.添加 CANlib
为了在VS2019项目中使用CANlib,我们必须添加信息,来告诉VS2019可以在何处找到CANlib文件。
这里只能给x86 或 x64 版本CANlib添加引用。然而,只要对一个文档稍微修改,我们就可以同时给两个版本添加。我会稍后在本文中演示这一点.
我将添加对win32版本的引用。当使用“anyCPU”时,我的设备默认为x64,但它似乎依然可以工作。
在我们开始之前,选择平台“anyCPU”(对此刻来说,这是我在此应用程序中默认启用的唯一平台)。
选择 “anyCPU” 作为平台:
3.1 添加“using Kvaser.CanLib;”
如果我们要创建一个 “.NET Core” 或者 “.NET Framework” (V4.6.1或更新版本) ,那我们必须添加:
using Kvaser.CanLib;
3.2添加 “Kvaser.CanLib” 引用
为了在VS2019项目中使用CANlib,我们必须添加信息来告诉VS2019可以在那里找到 “Kvaser.CANlib”。
在我的电脑里,我较早地找到了该路径:
“c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\”
右键点击 “References”, 然后选择 “Add Reference…”:
选择你需要的DLL,然后点击OK。我选择win32 版本。
(如果 DLL 不可见,那么就选择“Browse…”.)
现在我们可以看到 “Kvaser.CanLib”引用已添加上了:
3.3建立应用
如果我建立此应用,它就会工作!(有的时候)
此警告是正常的,当我们向此项目添加更多信息,警告就会消失。
3.4运行一个应用
如果我运行此应用,并点击Button1,文本框中将显示一些文字:
此应用可以启动CANlib,而且它已找到一些适配器。它似乎正常。
然而,有时我得到一个警告(WARNING),有时我得到一个错误(ERROR)。我不清楚为什么我会得到警告或错误,因为我应该总是得到错误。(我正在WIN64 电脑上运行此应用,调用win32 DLL,结果应该是一个错误。也许编译器试图警告我。)
这个小问题有一个简单的解决方案,在我们解决此问题的同时,我们还添加了对WIN32和WIN64应用程序平台的支持。继续阅读…
4为WIN32和WIN64激活CANlib
到目前为止,我们已经将“anyCPU”作为目标CPU平台使用。现在我们要将其设置为平台,以便为x86(win32)或x64(win64)构建应用程序。
选择 “Configuration Manager…”:
选择 “<New…>”,并添加x86和x64:
重要:使用 “Project contexts”中的 “new”, 而不能用 “Active solutions platform” 中的选项。
从 “anyCPU” 复制设置:
我为 x86 和 x64 分别做此操作,然后返回到主IDE(集成开发环境)。
5.测试x86 和 x64
选择 “x86” 并点击 “Start”:
它能工作!此应用开始了(但是我得到了一个警告)。
选择 “x64” 然后点击 “Start”:
我得到了一个警告,但我本来以为会得到一个错误。这是正常的,并将在下一节得到修正。
好,现在情况改善了不少。我们可以选择平台,有时会收到警告,有时得到一个错误。我前面说过我们会解决这个问题,现在看来时候正合适。
6.为Kvaser.CanLib WIN32/WIN64选择路径
我希望在我建立此项目时,VS2019自动选择正确的Kvaser.CanLib.dll版本。
我找到了这样做的一种方法(可能还有其他方法)。
根据我们创建的项目的种类,我们使用的方法也会不同:
6.1 Adjusting path for “.NET CORE” projects
6.2 Adjusting path for “.NETFramework” projects
在此处可查看更多信息:
6.1为 “.NET CORE” 项目调整路径
我们应该编辑文件 “WPF_NET_CORE.csproj” (ProjName.csproj)
在编辑前,该文件是如下所示:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup> .... </PropertyGroup> (Keep original info!)
<ItemGroup>
<Reference Include="Kvaser.CanLib">
<HintPath>C:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\Kvaser.CanLib.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
保留所有原始信息,但找到给Kvaser.CanLib.dll添加引用的<ItemGroup>
现在我们应该添加一些行,如下所示:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup> .... </PropertyGroup> (Keep original info!)
<ItemGroup>
<Reference Include="Kvaser.CanLib">
<HintPath>C:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\Kvaser.CanLib.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
<Reference Include="Kvaser.CanLib">
<HintPath>C:\Program Files (x86)\Kvaser\Canlib\dotnet\x64\netstandard2.0\Kvaser.CanLib.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
我添加了一个附带条件(x64)的ItemGroup。如果我选择x64作为平台,此 ItemGroup/Reference 将覆盖第一个 ItemGroup/Reference。在常规组之后添加此 x64 ItemGroup/Reference 非常重要。
在这之后,我们准备好了继续: 7 Running on platform x86 and x64
6.2为 “.NETFramework” 项目调整路径
在我的此项目的目录框中,有一个我们能编辑的文件:
WPF_NET_FRAMEWORK.csproj.user (%ProjName%.csproj.user)
但是我找不到它!该文件在哪里?
没关系。只有在你需要时,它是默认创建的。
让我们开始创建!
打开 “Project” – %ProjName%_Properties (在最下面)
去 “Reference Paths(引用路径)” 区,然后加路径到:
”c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\”
现在,保存此项目,然后关上VS2019。
当我们检查我们的项目目录,我们能找到此文件 “ProjName.csproj.user”。
我用我的文本编辑器打开它,如下所示:
(请注意,此文件能包含很多信息,所以有必要将它放在 “ReferencePath” 已定义的位置。)
?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ReferencePath>c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\</ReferencePath>
</PropertyGroup>
</Project>
我们添加属性组说明:
<PropertyGroup Condition=" '$(Platform)' == 'x64' ">
<ReferencePath>c:\Program Files (x86)\Kvaser\Canlib\dotnet\x64\netstandard2.0\</ReferencePath>
</PropertyGroup>
现在我的文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ReferencePath>c:\Program Files (x86)\Kvaser\Canlib\dotnet\win32\netstandard2.0\</ReferencePath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x64' ">
<ReferencePath>c:\Program Files (x86)\Kvaser\Canlib\dotnet\x64\netstandard2.0\</ReferencePath>
</PropertyGroup>
</Project>
我添加了一个附加 (x64)条件的PropertyGroup。如果我选择x64作为平台,这个属性组将覆盖第一个PropertyGroup。在常规组之后添加此 x64 组非常重要。
7. 在x86和x64平台上运行
我们现在能选择x86 (win32)和x64 (win64)作为活跃平台。在这两种情况下,此应用正确启动,可获取CANlib并运行正常。
我们现在已经在Visual Studio 2019中激活了CANlib, 创建了一个C# 项目(适合 .NET Framework 和 Netstandard) ,并在为x86和x64对它做了测试。
ΟΕΔ (Q.E.D. Quod erat demonstrandum)
8.思考和常见问题FAQ
当我选择anyCPU作为平台时,我会收到警告或错误!
当计算机启动Visual Studio时,如果我选择了anyCPU,软件将决定是使用32位还是64位版本的DLL。是的,anyCPU 也许都可以,但是如果我在另一台设备上运行已创建的应用程序,当设置不同,它可能不会运行。
(选择加载DLL可能行,请查看此外部链接了解更多详情:https://stackoverflow.com/questions/108971/using-side-by-side-assemblies-to-load-the-x64-or-x32-version-of-a-dll)
8.2最安全的设置?
如果我选x86 (WIN32)构建的应用,它在WIN32和WIN64 设备上均可运行。
8.3 我需要x64吗?
如果你的应用需要它,CANlib 能运行得非常理想,但仅限WIN64 设备。然而,今天 (2019), 多数Windows电脑用WIN64。
8.4 Microsoft Visual C++和Kvaser.CanLib Redistributable
当在另一台机器上安装你的应用程序(可能还没有安装VisualStudio)时,请记住重新分发(并安装)“Microsoft Visual C++ Redistributable for Visual Studio 2019”。你需要将Kvaser.CanLib.dll(x86和/或x64)与项目可执行文件一起复制。这些dll不是作为驱动程序的一部分安装的(它们是KVASER CANlib SDK的一部分)。
谢谢你阅读本文!如果你对本文有任何疑问或意见,请发送邮件至SUPPORT@KVASER.COM.