首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >P/调用失败调用

P/调用失败调用
EN

Stack Overflow用户
提问于 2014-01-31 17:50:45
回答 2查看 55关注 0票数 0

我在C++中定义了以下结构:

代码语言:javascript
复制
struct GraphicsAdapterDesc {
    // ... Just some constructors / operators / destructor here
    DEFINE_DEFAULT_CONSTRUCTOR(GraphicsAdapterDesc);
    DEFINE_DEFAULT_DESTRUCTOR(GraphicsAdapterDesc);
    ALLOW_COPY_ASSIGN_MOVE(GraphicsAdapterDesc);

    std::wstring AdapterName;
    int32_t AdapterNum;
    std::wstring HardwareHash;

    int64_t DedicatedVMEM;
    int64_t DedicatedSMEM;
    int64_t SharedSMEM;

    int32_t NumOutputs;
};

在C#中,我有一个“镜像”结构声明如下:

代码语言:javascript
复制
[StructLayout(LayoutKind.Sequential)]
public struct GraphicsAdapterDesc {
    string AdapterName;
    int AdapterNum;
    string HardwareHash;

    long DedicatedVMEM;
    long DedicatedSMEM;
    long SharedSMEM;

    int NumOutputs;
};

我试图在匹配变量的宽度时非常小心(尽管我有点不确定如何准确地处理字符串)。

无论如何,我有以下导出的C方法:

代码语言:javascript
复制
extern "C" __declspec(dllexport) bool GetGraphicsAdapter(int32_t adapterIndex, GraphicsAdapterDesc& outAdapterDesc) {
    outAdapterDesc = RENDER_COMPONENT.GetGraphicsAdapter(adapterIndex);
    return true;
}

下面是我的extern应用程序中的C#方法:

代码语言:javascript
复制
[DllImport(InteropUtils.RUNTIME_DLL, EntryPoint = "GetGraphicsAdapter", CallingConvention = CallingConvention.Cdecl)]
internal static extern bool _GetGraphicsAdapter(int adapterIndex, out GraphicsAdapterDesc adapterDesc);

然而,当我称之为它的时候,这是不正确的。根据是否以x64或x86模式编译( C++ DLL和C#应用程序都编译为x86或x64),我得到了不同的结果:

  • 在x86模式下,调用返回,但结构中包含“无意义”值,且字符串都为空,
  • 在x64模式下,调用抛出一个NullPointerException。

我的期望是,我做错了字符串编组,我需要为字符指定“宽模式”,但我不知道如何(或者这是否是正确的选项)。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-31 17:57:57

C++类型与C#不兼容,除非它们被包装在托管C++中。您使用的是std::wstring,它不能封送到.NET中。

要成功地互操作,您要么需要使用wchar_t[]whar_t*,然后告诉C#立即对其进行封送。

票数 2
EN

Stack Overflow用户

发布于 2014-01-31 17:56:08

我不知道您的宏在做什么,但是只有当您的c++类型是吊舱时,这才能起作用。c++11有一个扩展的意义,但我认为你不符合扩展的标准无论如何。否则你不能保证布局。如果您想将c++类导出到C#,我建议您使用c++\cli。此外,您在结构中定义了wstring,这肯定不是POD。当您使用DLLImport时,只考虑C结构,否则就会遇到麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21486743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档