新闻资讯

22/05/2020 作者 Kvaser

使用CANlib  Visual Studio 2019 C# .NET STANDARD 2.0

Kvaser CANlib C# 包装器已添加到.NET Standard。在本文中,我介绍在使用对 “.NET CORE” 和 “.NET Framework” 都适用的NET Standard 2.0. 创建一个C#项目时,如何在Visual Studio 2019中激活CANlib在现有项目中,也可以使用此文档激活CANlib

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”的安装位置。

在我的64Windows计算机上,它们安装在这里:

  • 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窗体设计器

此信息在20191115日有效。

这是来自微软的信息:

因为这是此设计器的第一次预览,所以它还没有与Visual Studio捆绑在一起,而是作为Visual Studio扩展(“VSIX”(download)提供。这意味着,如果在Visual Studio中打开一个针对.NET CoreWindows窗体项目,默认情况下它将没有设计器支持–你需要首先安装. .NET Core设计器!

你可以在此处阅读该文章全文:

Introducing .NET Core Windows Forms Designer Preview 1

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,结果应该是一个错误。也许编译器试图警告我。)

这个小问题有一个简单的解决方案,在我们解决此问题的同时,我们还添加了对WIN32WIN64应用程序平台的支持。继续阅读…

4为WIN32和WIN64激活CANlib

到目前为止,我们已经将“anyCPU”作为目标CPU平台使用。现在我们要将其设置为平台,以便为x86win32x64win64)构建应用程序。

选择 “Configuration Manager…”:

选择 “<New…>”,并添加x86x64:

重要:使用 “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

在此处可查看更多信息:

How to: Configure projects to target platforms

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) ,并在为x86x64对它做了测试。

ΟΕΔ  (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)构建的应用,它在WIN32WIN64 设备上均可运行。

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.dllx86/x64)与项目可执行文件一起复制。这些dll不是作为驱动程序的一部分安装的(它们是KVASER CANlib SDK的一部分)。

谢谢你阅读本文!如果你对本文有任何疑问或意见,请发送邮件至SUPPORT@KVASER.COM