你能在UWP中使用C++的DLL吗?

2024-05-02 14:04:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在VisualStudio中编写了一个C++类库,它定义了一个调用一些Python的函数:

#pragma once

#include <Python.h>

extern "C"
__declspec(dllexport)
void python()
{
    Py_Initialize();
    PyRun_SimpleString("2 + 2");
}

我用同样的解决方案做了另一个项目,那就是一个C#Blank通用应用程序。我试图引用从前面提到的项目生成的DLL:

using System;
...

namespace StartupApp
{
    ...
    sealed partial class App : Application
    {
        private const string CPPPythonInterfaceDLL = @"pathtodll";

        [DllImport(CPPPythonInterfaceDLL, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
        private static extern void python();

        public static void Python()
        {
            python();
        }
        ...
        public App()
        {
            ...

            Python();
        }

        ...
    }
}

应用程序处于发布配置中。

每当我尝试在本地计算机上运行应用程序时,它总是会给出一个错误:

The program '[2272] StartupApp.exe' has exited with code -1073741790 (0xc0000022).
Activation of the Windows Store app 'ab6a8ef2-1fa8-4cc7-b7b3-fb7420af7dc3_7dk3a6v9mg4g6!App' failed with error 'The app didn't start'.
我的问题是:我能引用C语言UWP项目中的C++类库吗?或者UWP应用的安全性不允许这样做?

或者是因为Python.h?

编辑:

我用一个DLL项目和一个包装它的运行时组件构建了该项目,现在出现了以下错误:

“系统”类型的异常

'System.DllNotFoundException' occurred in StartupApp.exe but was not handled in user code

Additional information: Unable to load DLL 'pathtodll': Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

我在DLL中添加了一个对象名为“Everyone”的用户(我不知道该如何授予Everyone权限),但仍然会出现错误。


Tags: 项目app应用程序错误externstatic类库private
1条回答
网友
1楼 · 发布于 2024-05-02 14:04:50

首先,UWP不能通过DLIMLPOUNT消耗遗留的C++ DLL。

如果你想将传统C++函数暴露给C++,第一个建议就是用WRET组件包装C++逻辑。然后,可以通过以下步骤在UWP应用程序中引用此组件:将其添加到项目中,在解决方案资源管理器窗口中打开文件的属性,并将它们标记为要包含在应用程序包中的内容。This post会有帮助的。This one提供了更详细的步骤。

如果您想要PInvoke这个dll,可以按照以下步骤操作(可以参考这个MSDN post):

  1. 将win32 dll添加到UWP项目中,确保将其类型设置为“content”

  2. 然后在正确的cs文件中,使用DllImport来PInvoke dll。

还有一件事:您需要确保Python dll没有在WinRT中使用被禁止的api。您可以使用dll的/ZW compile选项对此进行检查。

相关问题 更多 >