如何将 C 程序放入 C# UWP?

How do I put a C program in a C# UWP?

我正在创建一个处理文件的 Windows 10 应用程序。对于 GUI,我使用 UWP (C#),对于文件处理,我想使用 C 语言 (Visual Studio 2019)。

我已经尝试过这些解决方案(none 有效):

  1. 使用 Windows 桌面向导 (DLL) 创建的 C 程序,然后是 DllImport

尝试使用 DllImport(在 C# 控制台应用程序中有效)将其添加到 UWP。

C文件中的代码:

#include<stdio.h>

_declspec(dllexport) int getNumberOfFiles()
{
    ...
}

C# UWP 应用中的代码:

 [DllImport(@"...\WorkFilesDll\Debug\WorkFilesDll.dll", EntryPoint = "getNumberOfFiles", CallingConvention = CallingConvention.Cdecl)]
 internal static extern int getNumberOfFiles();

抛出以下异常:

System.DllNotFoundException HResult=0x80131524 Message=Unable to load DLL '...\WorkFilesDll\Debug\WorkFilesDll.dll' or one of its dependencies: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

  1. 使用 Windows 桌面向导 (DLL) 创建的 C 程序,然后添加为参考

尝试添加与引用相同的 dll(引用->添加引用->浏览->添加->确定)。 按确定按钮后,出现以下消息表示失败:

A reference to "...\WorkFilesDll\Debug\WorkFilesDll.dll" could not be added. Please make sure that the file is accessible, and that is a valid assembly or COM component.

  1. 我为 C 代码 (C++, UWP) 创建了其他类型的项目:Dll (Universal Windows), Windows Runtime Component (Universal Windows ).结果是一样的。

  2. 我创建了其他类型的项目(C#、UWP):Class库(通用Windows),Windows运行时组件(通用Windows),以便将这些项目添加到 UWP 并将上述 dll 添加到这些项目(要间接添加到 UWP 的 C 代码)。结果是一样的。

我发现了很多这样的问题和文章,但我没有看到明确的答案,或者这些答案对我不起作用。其中一些是:

我也读过静态库。我未能实施它们。

如何将 C 代码放入 UWP (C#)?

静态库是我的应用程序的答案吗?

哪个更适合此应用程序:DLL 还是静态库?为什么?

谢谢!

请检查以下步骤:

  1. 在新解决方案中创建一个 C# UWP 项目。
  2. 在同一解决方案中添加一个 C++ DLL(Universal Windows) 项目(名为 MyDll1)。
  3. 在 C++ DLL 项目中添加您的 C 代码。例如:
//MyDll1.h
#pragma once

extern "C" _declspec(dllexport) int Sum(int a, int b);

//MyDll1.cpp
#include "pch.h"
#include "MyDll1.h"
int Sum(int a, int b)
{
    return a + b;
}
  1. 在同一项目中添加一个Windows运行时组件(C++/WinRT)项目。
  2. 右键单击Windows运行时组件(C++/WinRT)项目的名称,然后select选项添加> Reference,在 Projects 选项卡中检查您的 DLL 项目。单击确定
  3. 有一个自动生成的 class Class,您可以使用 class 或添加其他 class(Add > New Item > Code > Midl File(.idl)) 根据需要。新的 class 必须从 midl 文件生成。您可以参考 document.
  4. 获得有关创作 api 的更多信息
  5. Classclass为例。在Windows Runtime Component(C++/WinRT)项目中包含dll的头文件。
//Class.h
#include "..\MyDll1\MyDll1.h"
  1. Class class 中显示了一个名为 MyProperty 的示例方法。 MyProperty方法被添加到Class.idl文件中,编译器会在您构建工程后在Class.hClass.cpp中生成相应的方法。并且您需要转到 文件资源管理器 中的位置 \RuntimeComponent\ RuntimeComponent \Generated Files\sources\Class.hClass.cpp 并打开 .h 和 .cpp 文件以将生成的方法复制到您的代码中Visual Studio。您可以使用 MyProperty 方法将值传递给 C# 项目或在 classes 中添加其他方法。有关如何在 idl 文件中添加新方法的更多信息,请参阅 document
  2. 您可以在 MyProperty 方法中调用 MyDll1 项目的 Sum(int a, int b)
int32_t Class::MyProperty()
{
    int t = Sum(1, 2);
    return t;
}
  1. 右键单击 C# UWP 项目的名称,然后 select 选项 Add > Reference,检查你的 Windows 项目 中的运行时组件(C++/WinRT) 项目。单击确定
  2. 在 C# UWP 项目中添加 include 语句。
using RuntimeComponent;   // RuntimeComponent is the name of Windows Runtime Component(C++/WinRT) project.
  1. 您可以在 C# UWP 项目中调用 MyProperty 方法。
RuntimeComponent.Class myClass = new Class();
var value = myClass.MyProperty;