0

在托管库之间共享非托管结构最好(简单而不会增加很多开销)是什么?

假设我有一个托管类库,如下所示:

// MyClassLib.h
#pragma once
#include "MyLegacyStruct.h"
using namespace System;

namespace MyClassLib {

    public ref class Class1
    {
    protected:
        MyLegacyStruct* m_internalBuffer;

    public:
        Class1() { }
        ~Class1() { }

        MyLegacyStruct* GetBuffer()
        {
            return m_internalBuffer;
        }
    };
}

...结构定义(在库中):

// MyLegacyStruct.h
#pragma once

namespace MyClassLib {

    typedef struct MyLegacyStruct
    {
        unsigned int m_someVar;

    } MyLegacyStruct;

}

...以及一个想要使用该库的简单控制台应用程序:

// ConsoleApp.cpp : main project file.

#include "stdafx.h"
#include "MyLegacyStruct.h"

using namespace System;
using namespace MyClassLib;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");

    Class1^ c1 = gcnew Class1();
    MyLegacyStruct* s1 = c1->GetBuffer(); // <-- This is a problem

    return 0;
}

...这使编译器发牢骚:

2>.\ConsoleApp.cpp(14) : error C3767: 'MyClassLib::Class1::GetBuffer': candidate function(s) not accessible

内部缓冲区用于一些相当繁重的处理算法,然后将这些算法与 .net 代码粘合在一起,使其一切都变得漂亮和模块化,并挂接到 C# gui 以及一些命令行重新处理工具中。

这样做的正确方法是什么?返回一个void *?制作一个.net ref struct,使用它复制模块之间的所有数据,然后再转换回来?

4

1 回答 1

2

这已经在C++ CLI 错误 C3767: Candidate function(s) not accessible by Ben Schwehn的堆栈溢出问题上得到了回答。

总之:

默认情况下,本机类型在程序集外是私有的。本机类型现在默认情况下在程序集外不可见。有关程序集外部类型可见性的详细信息,请参阅类型可见性。此更改主要是由使用其他不区分大小写的语言的开发人员在引用以 Visual C++ 编写的元数据时的需求驱动的。 来源

如果您使用#pragma make_public(MyClassLib::MyLegacyStruct), 导出程序集中的 MyLegacyStruct 本机类型,那么您的项目将编译。

于 2012-09-12T09:38:41.547 回答