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 構造体を作成し、それを使用してモジュール間ですべてのデータをコピーしてから元に戻しますか?

4

1 に答える 1

2

これは、以前のC++ CLI エラー C3767: 候補関数 (s)Ben Schwehnがアクセスできないというスタック オーバーフローで既に回答されています。

要約すれば:

ネイティブ型はアセンブリ外ではデフォルトで非公開 ネイティブ型は、デフォルトでアセンブリ外では表示されなくなりました。アセンブリ外の型の可視性の詳細については、型の可視性を参照してください。この変更は、主に、Visual C++ で作成されたメタデータを参照するときに、大文字と小文字を区別しない他の言語を使用する開発者のニーズによって推進されました。 ソース

を使用#pragma make_public(MyClassLib::MyLegacyStruct)して MyLegacyStruct ネイティブ型をアセンブリにエクスポートすると、プロジェクトがコンパイルされます。

于 2012-09-12T09:38:41.547 に答える