【发布时间】:2021-09-23 14:20:50
【问题描述】:
我正在开发一个 .NET 5 项目,以使用 PInvoke、类型编组和 DllImportAttribute 将 AWS-Encryption-SDK 从 C 和 C++ 绑定到 C#。尝试调用此 C++ 函数时
aws_cryptosdk_keyring *Build(const Aws::String &generator_key_id, const Aws::Vector<Aws::String> &additional_key_ids = {}) const;
使用
[DllImport("aws-encryption-sdk-cpp.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern aws_cryptosdk_keyring Build(string generator_key_id, string[] additional_key_ids = null);
我收到此错误
System.EntryPointNotFoundException:无法在 DLL“aws-encryption-sdk-cpp.dll”中找到名为“Build”的入口点。
这个函数的dll签名是
?Build@Builder@KmsKeyring@Cryptosdk@Aws@@QEBAPEAUaws_cryptosdk_keyring@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$vector @V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V ?$allocator@D@2@@std@@@2@@7@@Z
到目前为止,我没有尝试过,因为 EntryPoint 是成功的。有人有什么想法吗?
【问题讨论】:
-
没有像“C/C++”这样的语言,只有两种截然不同的语言C或C++。请不要像那样把两者混在一起。由于您尝试调用 C++ 函数,请删除 C 标记(以及所有提及“C/C++”)。
-
你可能想要一个
extern "C"围绕该函数,以防止名称损坏。 -
C# 不会神奇地知道如何处理 Aws::String 和 Aws::Vector。我的意思是你甚至可以从这样的 DLL 中导出 C++ 函数吗?一般要将DllImort转换成C#你需要一个C接口。您可以根据详细信息以各种方式将 C++ 封装在 C 函数接口中进行 AWS 调用。
标签: c# c++ c amazon-web-services dllimport