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

C# 如何将C程序放入C UWP中?,c#,c,dll,uwp,static-libraries,C#,C,Dll,Uwp,Static Libraries,我正在创建一个使用文件的Windows 10应用程序。对于GUI,我使用UWP C,对于文件处理,我希望使用C语言Visual Studio 2019 我尝试过这些解决方案,但没有一个有效: 用Windows桌面向导DLL创建的C程序,然后是DllImport 尝试使用DllImport将其添加到UWP中,这在C控制台应用程序中起作用 C文件中的代码: #include<stdio.h> _declspec(dllexport) int getNumberOfFiles() {

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

我尝试过这些解决方案,但没有一个有效:

用Windows桌面向导DLL创建的C程序,然后是DllImport 尝试使用DllImport将其添加到UWP中,这在C控制台应用程序中起作用

C文件中的代码:

#include<stdio.h>

_declspec(dllexport) int getNumberOfFiles()
{
    ...
}
将引发以下异常:

System.DllNotFoundException HResult=0x80131524消息=无法 要加载DLL“…\WorkFilesDll\Debug\WorkFilesDll.DLL”或其 依赖项:访问被拒绝。来自HRESULT的异常:0x80070005 E_访问被拒绝

用Windows桌面向导DLL创建C程序,然后添加为参考 尝试添加与引用->添加引用->浏览->添加->确定相同的dll。 按下OK(确定)按钮后,以下消息表示故障:

无法找到对…\WorkFilesDll\Debug\WorkFilesDll.dll的引用 补充。请确保该文件是可访问的,并且是 有效的程序集或COM组件

< >我为C代码C++、UWP:DLL通用窗口、Windows运行时组件通用窗口创建了其他类型的项目。结果是一样的

我创建了其他类型的项目C,UWP:Class Library Universal Windows,Windows Runtime Component Universal Windows,以便将这些项目添加到UWP中,并将上面提到的dll添加到这些项目中,C代码将间接添加到UWP中。结果是一样的

我发现了很多这样的问题和文章,但我没有看到一个明确的答案,或者这些答案对我来说并不适用。其中包括:

我也读过关于静态库的文章。我没能实施它们

如何将C代码放入UWP C中

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

对于这个应用程序,哪一个更好:DLL还是静态库?为什么?


谢谢大家!

请检查以下步骤:

在新解决方案中创建C UWP项目。 在同一个解决方案中添加C++ DLL通用Windows项目MyDLL1。 在C++ DLL项目中添加C代码。例如: 在同一项目中添加Windows运行时组件C++/WinRT项目。 右键单击Windows运行时组件C++/WinRT项目的名称,然后选择选项“添加”>“引用”,在“项目”选项卡中检查DLL项目。单击“确定”。 有一个自动生成的类,您可以使用该类或根据需要添加其他类add>New Item>Code>Midl File.idl。新类必须从midl文件生成。您可以参考。 以班级为例。在Windows运行时组件C++/WinRT项目中包含dll的头文件。 类中显示了一个名为MyProperty的示例方法。MyProperty方法被添加到Class.idl文件中,编译器将在您构建项目后在Class.h和Class.cpp中生成相应的方法。您需要转到文件资源管理器中的位置\RuntimeComponent\RuntimeComponent\Generated Files\sources\Class.h和Class.cpp,然后打开.h和.cpp文件,将生成的方法复制到Visual Studio中的代码中。您可以使用MyProperty方法将值传递给C project或在类中添加其他方法。有关如何在idl文件中添加新方法的更多信息,请参阅。 您可以在MyProperty方法中调用MyDll1项目的Sumint a,int b。 右键单击C UWP项目的名称,选择选项Add>Reference,在项目中检查Windows运行时组件C++/WinRT项目。单击“确定”。 在C UWP项目中添加include语句。 您可以在C UWP项目中调用MyProperty方法。
请检查以下步骤:

在新解决方案中创建C UWP项目。 在同一个解决方案中添加C++ DLL通用Windows项目MyDLL1。 在C++ DLL项目中添加C代码。例如: 在同一项目中添加Windows运行时组件C++/WinRT项目。 右键单击Windows运行时组件C++/WinRT项目的名称,然后选择选项“添加”>“引用”,在“项目”选项卡中检查DLL项目。单击“确定”。 有一个自动生成的类,您可以使用该类或根据需要添加其他类add>New Item>Code>Midl File.idl。新类必须从midl文件生成。您可以参考。 以班级为例。在Windows运行时组件C++/WinRT项目中包含dll的头文件。 类中显示了一个名为MyProperty的示例方法。MyProperty方法被添加到Class.idl文件中,编译器将在您构建项目后在Class.h和Class.cpp中生成相应的方法。您需要转到文件资源管理器中的位置\RuntimeComponent\RuntimeComponent\Generated Files\sources\Class.h和Class.cpp,并打开.h和.cpp文件以复制Generator 在VisualStudio中将方法插入到代码中。您可以使用MyProperty方法将值传递给C project或在类中添加其他方法。有关如何在idl文件中添加新方法的更多信息,请参阅。 您可以在MyProperty方法中调用MyDll1项目的Sumint a,int b。 右键单击C UWP项目的名称,选择选项Add>Reference,在项目中检查Windows运行时组件C++/WinRT项目。单击“确定”。 在C UWP项目中添加include语句。 您可以在C UWP项目中调用MyProperty方法。
你想这样做的具体原因是什么?看来你无缘无故地把事情搞复杂了。C可以做文件处理。C++可以做GUI。为什么要坚持把它们混在一起,而且会有更多的麻烦呢?是的。我想用C来处理GUI和C,而不是C++。C提供了更好的文件处理,访问一些文件,速度等等。。我想用C来做GUI,因为在我看来,用UWP C创建的GUI比C++中的GUI要好。如果你遵循最后一个链接的指导,它应该会成功。这里真正的问题是UWP禁止某些Win32 API,这就是您拒绝E_访问的原因。据我所知,UWP不支持运行依赖于特定系统的库。对于静态库或DLL来说,UWP是一种武器?您希望这样做的具体原因是什么?看来你无缘无故地把事情搞复杂了。C可以做文件处理。C++可以做GUI。为什么要坚持把它们混在一起,而且会有更多的麻烦呢?是的。我想用C来处理GUI和C,而不是C++。C提供了更好的文件处理,访问一些文件,速度等等。。我想用C来做GUI,因为在我看来,用UWP C创建的GUI比C++中的GUI要好。如果你遵循最后一个链接的指导,它应该会成功。这里的真正问题是UWP禁止一些Win32 API,为什么你得到了EAAccess。据我所知,UWP不支持运行依赖于特定系统的库。@静态库或DLL的ULTIMAMAL武器。通过大量测试,我让C UWP项目成功地引用了C++ DLLUniversity Windows。您需要在dll的属性中设置两个选项。请将选项属性>C/C++>常规>使用Windows运行时扩展设置为Yes/ZW,并将选项属性>链接器>Windows元数据>生成Windows元数据设置为Yes/WINMD。如果EntryPoint存在错误,那么您可以找到dllMain.cpp文件并删除Main中的switch语句。dll中的代码可以类似于:extern C int uu declspecdllexport Sumint a,int b{return a+b;}和uwp项目中的导入代码如下:[dlliportdlname.dll,EntryPoint=Sum]私有静态外部数据集a、b;如果您使用的是Visual Studio 2019,请注意将uwp项目和dll项目的平台设置为x64。非常感谢!通过大量的测试,我让C UWP项目成功地引用了C++ DLLUniversity Windows。您需要在dll的属性中设置两个选项。请将选项属性>C/C++>常规>使用Windows运行时扩展设置为Yes/ZW,并将选项属性>链接器>Windows元数据>生成Windows元数据设置为Yes/WINMD。如果EntryPoint存在错误,那么您可以找到dllMain.cpp文件并删除Main中的switch语句。dll中的代码可以类似于:extern C int uu declspecdllexport Sumint a,int b{return a+b;}和uwp项目中的导入代码如下:[dlliportdlname.dll,EntryPoint=Sum]私有静态外部数据集a、b;如果您使用的是Visual Studio 2019,请注意将uwp项目和dll项目的平台设置为x64。非常感谢!
 [DllImport(@"...\WorkFilesDll\Debug\WorkFilesDll.dll", EntryPoint = "getNumberOfFiles", CallingConvention = CallingConvention.Cdecl)]
 internal static extern int getNumberOfFiles();
//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;
}
//Class.h
#include "..\MyDll1\MyDll1.h"
int32_t Class::MyProperty()
{
    int t = Sum(1, 2);
    return t;
}
using RuntimeComponent;   // RuntimeComponent is the name of Windows Runtime Component(C++/WinRT) project.
RuntimeComponent.Class myClass = new Class();
var value = myClass.MyProperty;