我知道如何使用 LoadPackagedLibrary
将外部模块(DLL)加载到 UWP 应用程序。问题是我有许多具有不同签名的函数。有没有更简单的方法将函数导入应用程序,就像在 C++ 中使用头文件一样?
由于您有 .lib
和头文件,因此创建 C++/WinRT 包装器组件可以相对容易地公开库中的所有特性(函数)。假设您有 test.lib
库和简单的头文件 test.h
,例如:
#pragma once
int add(int a, int b);
您应该执行以下操作:
- 安装 C++/WinRT VS extension ;
- 创建“Windows 运行时组件 (C++/WinRT)”项目。请注意,此项目类型来自第一步的扩展。您不应使用默认情况下在 VS 中的“Windows 运行时组件(通用 Windows)”项目类型。将项目命名为
TestWrapper
;
- 打开项目属性窗口(在解决方案资源管理器中右键单击项目 -> “属性”),导航到 C/C++ -> 常规 -> 附加包含目录,并添加包含头文件的目录路径(
测试.h
);
- 在同一个属性窗口中导航到 Linker -> Input -> Additional dependencies,并添加
test.lib
文件路径;
- 将新的 MIDL 文件添加到项目中(右键单击 -> 添加... -> 新项目... -> C++ -> 代码 -> Midl 文件 (.idl),并将文件命名为
Test。 idl
. 添加如下内容:
namespace TestWrapper
{
[default_interface]
runtimeclass Test
{
Test();
static Int32 Add(Int32 a, Int32 b);
}
}
- 添加新的
Test.h
头文件,内容如下:
#pragma once
#include "Test.g.h"
namespace winrt::TestWrapper::implementation
{
struct Test: TestT<Test>
{
Test() = default;
static int32_t Add(int32_t a, int32_t b);
};
}
namespace winrt::TestWrapper::factory_implementation
{
struct Test : TestT<Test, implementation::Test>
{
};
}
- 添加新的
Test.cpp
文件,内容如下:
#include "pch.h"
#include "Test.h"
// if the original test.lib is C library you need to include
// the header file in the following way:
extern "C" {
#include "test.h"
}
namespace winrt::TestWrapper::implementation
{
int32_t Test::Add(int32_t a, int32_t b)
{
// We are calling the original library method to get the result:
return add(a, b);
}
}
最后,您可以从使用任何语言(即 JavaScript)编写的任何 UWP 应用中引用生成的组件。以下是从 C# 调用该方法的方法:
using TestWrapper;
class MyClass
{
void SomeMethod()
{
var sum = Test.Add(2, 3);
}
}
这里我将 Test.Add
实现为静态方法,但它也可以作为实例方法实现...
希望对您有所帮助。
我是一名优秀的程序员,十分优秀!