您可以在UWP的C#代码中使用C ++ DLL吗?

M3579

我在Visual Studio中编写了一个C ++类库,该类库仅定义了调用某些Python的函数:

#pragma once

#include <Python.h>

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

我在与C#Blank Universal应用程序相同的解决方案中创建了另一个项目。我尝试引用我提到的上一个项目生成的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的例外

'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))

我将对象名称为“ Everyone”的用户添加到了DLL中(我不确定如何向其他人授予权限),但是仍然出现错误。

Fangfang Wu - MSFT

首先,UWP不能仅通过DLLImport消耗旧版C ++ dll。

如果要将传统的c ++函数公开给C#,第一个建议是使用WinRT组件包装该C ++逻辑。然后,您可以通过以下步骤在UWP应用程序中引用此组件:将其添加到项目中,在“解决方案资源管理器”窗口中打开文件的属性,并将它们标记为要包含在应用程序包中的内容。这篇文章会有所帮助。步骤提供了更详细的步骤。

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

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

  2. 然后在适当的cs文件中,使用DllImport PInvoke dll。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我们可以在Python中使用C代码吗?

我可以在C#中使用无类型的集合吗?

您可以在Redis c#中检索TTL吗?

您可以在C中使用带有已分配参数值的函数指针吗?

您可以为DLL创建多个头文件吗?您可以合并头文件吗?

您可以在switch语句(C#)中使用多个值吗

您可以在多行字符串文字中使用C / C ++预处理程序令牌吗

在PowerShell中使用引用的DLL运行C#代码

BadImageFormatException:尝试在C#中使用C ++ DLL文件吗?

它可以加密dll代码吗?

我可以在非托管Delphi EXE中使用托管C#DLL吗?

使用非托管代码的C#应用程序加载msvcr90.dll + msvcr80.dll + msvcr100.dll。这有关系吗?

可以在Lua中加载C ++ dll文件吗?

您可以在C中使函数参数指向变量吗?

您可以在getElementById中使用通配符吗?

在C#中使用的C ++ COM DLL

病毒可以中断dll函数调用吗

在C#中使用C ++ dll对象

您可以使用C#中没有字段的属性吗?

您可以在C / C ++ include指令中使用环境变量吗?

.net可以从内存中动态加载c ++ / cli dll吗?

您可以在所有云代码方法中使用全局util函数吗?

您可以在C#中使用太多新实例来引起内存问题吗?

您可以使用itextsharp C#设置字体中字母之间的距离吗

我可以在C#中使用saxon导入查询吗?

在C#代码中使用cpp dll

您可以在C中使用阶乘宏吗?

我可以在 Xamarin 中使用任何 C# 库吗

Delphi DLL 可以被 PInvoked 并在 C# 中使用吗?