如何将 C 程序放入 C# UWP?
How do I put a C program in a C# UWP?
我正在创建一个处理文件的 Windows 10 应用程序。对于 GUI,我使用 UWP (C#),对于文件处理,我想使用 C 语言 (Visual Studio 2019)。
我已经尝试过这些解决方案(none 有效):
- 使用 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))
- 使用 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.
我为 C 代码 (C++, UWP) 创建了其他类型的项目:Dll (Universal Windows), Windows Runtime Component (Universal Windows ).结果是一样的。
我创建了其他类型的项目(C#、UWP):Class库(通用Windows),Windows运行时组件(通用Windows),以便将这些项目添加到 UWP 并将上述 dll 添加到这些项目(要间接添加到 UWP 的 C 代码)。结果是一样的。
我发现了很多这样的问题和文章,但我没有看到明确的答案,或者这些答案对我不起作用。其中一些是:
- https://docs.microsoft.com/en-us/cpp/cppcx/dlls-c-cx?view=msvc-160
- https://www.c-sharpcorner.com/forums/how-to-use-cpp-dlls-in-c-sharp-uwp-projects
- How to call a function from DLL in UWP?
- https://docs.microsoft.com/en-us/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=msvc-160
我也读过静态库。我未能实施它们。
如何将 C 代码放入 UWP (C#)?
静态库是我的应用程序的答案吗?
哪个更适合此应用程序:DLL 还是静态库?为什么?
谢谢!
请检查以下步骤:
- 在新解决方案中创建一个 C# UWP 项目。
- 在同一解决方案中添加一个 C++ DLL(Universal Windows) 项目(名为
MyDll1
)。
- 在 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;
}
- 在同一项目中添加一个Windows运行时组件(C++/WinRT)项目。
- 右键单击Windows运行时组件(C++/WinRT)项目的名称,然后select选项添加> Reference,在 Projects 选项卡中检查您的 DLL 项目。单击确定。
- 有一个自动生成的 class
Class
,您可以使用 class 或添加其他 class(Add > New Item > Code > Midl File(.idl)) 根据需要。新的 class 必须从 midl 文件生成。您可以参考 document. 获得有关创作 api 的更多信息
- 以
Class
class为例。在Windows Runtime Component(C++/WinRT)
项目中包含dll的头文件。
//Class.h
#include "..\MyDll1\MyDll1.h"
Class
class 中显示了一个名为 MyProperty
的示例方法。 MyProperty
方法被添加到Class.idl
文件中,编译器会在您构建工程后在Class.h
和Class.cpp
中生成相应的方法。并且您需要转到 文件资源管理器 中的位置 \RuntimeComponent\ RuntimeComponent \Generated Files\sources\Class.h
和 Class.cpp
并打开 .h 和 .cpp 文件以将生成的方法复制到您的代码中Visual Studio。您可以使用 MyProperty
方法将值传递给 C# 项目或在 classes 中添加其他方法。有关如何在 idl 文件中添加新方法的更多信息,请参阅 document。
- 您可以在
MyProperty
方法中调用 MyDll1
项目的 Sum(int a, int b)
。
int32_t Class::MyProperty()
{
int t = Sum(1, 2);
return t;
}
- 右键单击 C# UWP 项目的名称,然后 select 选项 Add > Reference,检查你的 Windows 项目 中的运行时组件(C++/WinRT) 项目。单击确定。
- 在 C# UWP 项目中添加 include 语句。
using RuntimeComponent; // RuntimeComponent is the name of Windows Runtime Component(C++/WinRT) project.
- 您可以在 C# UWP 项目中调用
MyProperty
方法。
RuntimeComponent.Class myClass = new Class();
var value = myClass.MyProperty;
我正在创建一个处理文件的 Windows 10 应用程序。对于 GUI,我使用 UWP (C#),对于文件处理,我想使用 C 语言 (Visual Studio 2019)。
我已经尝试过这些解决方案(none 有效):
- 使用 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))
- 使用 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.
我为 C 代码 (C++, UWP) 创建了其他类型的项目:Dll (Universal Windows), Windows Runtime Component (Universal Windows ).结果是一样的。
我创建了其他类型的项目(C#、UWP):Class库(通用Windows),Windows运行时组件(通用Windows),以便将这些项目添加到 UWP 并将上述 dll 添加到这些项目(要间接添加到 UWP 的 C 代码)。结果是一样的。
我发现了很多这样的问题和文章,但我没有看到明确的答案,或者这些答案对我不起作用。其中一些是:
- https://docs.microsoft.com/en-us/cpp/cppcx/dlls-c-cx?view=msvc-160
- https://www.c-sharpcorner.com/forums/how-to-use-cpp-dlls-in-c-sharp-uwp-projects
- How to call a function from DLL in UWP?
- https://docs.microsoft.com/en-us/cpp/porting/how-to-use-existing-cpp-code-in-a-universal-windows-platform-app?view=msvc-160
我也读过静态库。我未能实施它们。
如何将 C 代码放入 UWP (C#)?
静态库是我的应用程序的答案吗?
哪个更适合此应用程序:DLL 还是静态库?为什么?
谢谢!
请检查以下步骤:
- 在新解决方案中创建一个 C# UWP 项目。
- 在同一解决方案中添加一个 C++ DLL(Universal Windows) 项目(名为
MyDll1
)。 - 在 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;
}
- 在同一项目中添加一个Windows运行时组件(C++/WinRT)项目。
- 右键单击Windows运行时组件(C++/WinRT)项目的名称,然后select选项添加> Reference,在 Projects 选项卡中检查您的 DLL 项目。单击确定。
- 有一个自动生成的 class
Class
,您可以使用 class 或添加其他 class(Add > New Item > Code > Midl File(.idl)) 根据需要。新的 class 必须从 midl 文件生成。您可以参考 document. 获得有关创作 api 的更多信息
- 以
Class
class为例。在Windows Runtime Component(C++/WinRT)
项目中包含dll的头文件。
//Class.h
#include "..\MyDll1\MyDll1.h"
Class
class 中显示了一个名为MyProperty
的示例方法。MyProperty
方法被添加到Class.idl
文件中,编译器会在您构建工程后在Class.h
和Class.cpp
中生成相应的方法。并且您需要转到 文件资源管理器 中的位置\RuntimeComponent\ RuntimeComponent \Generated Files\sources\Class.h
和Class.cpp
并打开 .h 和 .cpp 文件以将生成的方法复制到您的代码中Visual Studio。您可以使用MyProperty
方法将值传递给 C# 项目或在 classes 中添加其他方法。有关如何在 idl 文件中添加新方法的更多信息,请参阅 document。- 您可以在
MyProperty
方法中调用MyDll1
项目的Sum(int a, int b)
。
int32_t Class::MyProperty()
{
int t = Sum(1, 2);
return t;
}
- 右键单击 C# UWP 项目的名称,然后 select 选项 Add > Reference,检查你的 Windows 项目 中的运行时组件(C++/WinRT) 项目。单击确定。
- 在 C# UWP 项目中添加 include 语句。
using RuntimeComponent; // RuntimeComponent is the name of Windows Runtime Component(C++/WinRT) project.
- 您可以在 C# UWP 项目中调用
MyProperty
方法。
RuntimeComponent.Class myClass = new Class();
var value = myClass.MyProperty;