ページ 11

【C#】 「アクセスできない保護レベルになっています」というエラー

Posted: 2013年1月27日(日) 11:50
by h2so5
C++/CLIを使ってクラスライブラリを作成し、それをC#から呼びだそうと思っています。
参照設定にDLLを追加し、以下のようなコードを書きました。

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace cli_test
{
    class Program
    {
        static void Main(string[] args)
        {
            AttacheCase.Unlocker unlocker = new AttacheCase.Unlocker();

            FileStream infs = new FileStream("test.atc", FileMode.Open);
            int[] key = new int[] {};

            unlocker.open(infs, key);
        }
    }
}
しかし、18行目でコンパイルエラーが発生してしまいます。
エラー CS0122: 'AttacheCase.Unlocker.open(System.IO.Stream, int[])' はアクセスできない保護レベルになっています。
C++/CLI側のヘッダは

コード:

using namespace System;

namespace AttacheCase {

public ref class Unlocker
{
public:
	Unlocker();
	~Unlocker();

public:
	ATCResult open(Stream ^src, array<int>^ key);
	ATCResult close();

	size_t getEntryLength();
	ATCResult getEntry(ATCFileEntry *entry, size_t index);
	ATCResult extractFileData(ostream *dst, istream *src, size_t length);

public:
	int32_t data_version();
	char data_sub_version();
	int32_t algorism_type();
	char passwd_try_limit();
	bool self_destruction();

private:
	ATCUnlocker_impl *impl_;
};

}
となっており、Unlocker::openはpublicなメンバ関数になっています。
念のためC#のオブジェクトブラウザを使ってDLLを見てみましたが、ちゃんとpublicな関数として登録されています。

C++/CLIとC#に関する知識が浅いので原因がよく分からないのですが、
プロジェクトを添付しておきましたので同じようなエラーが出るかどうか確かめていただけないでしょうか。

Visual C# 2010 のプロジェクトとビルド済みのDLLが入っています。C++/CLIのプロジェクトは入っていません。
特に設定なしにビルドを開始できると思います。

Re: 【C#】 「アクセスできない保護レベルになっています」というエラー

Posted: 2013年1月27日(日) 20:20
by へにっくす
Visual Studio 2012 Express Windows Desktopで開いてビルドしてみましたが同じエラーが出ます。
一応報告まで

Re: 【C#】 「アクセスできない保護レベルになっています」というエラー

Posted: 2013年1月27日(日) 20:51
by h2so5
へにっくすさん、ありがとうございます。

どうやらenumとして定義していた関数の戻り値の型のATCResultがprivateだったのが原因のようです。
C++/CLIのenumは明示的にpublicにしないとC#から使えないということ。

C++

コード:

enum ATCResult {
    ...
};


C++/CLI

コード:

public enum ATCResult {
    ...
};
オフトピック
それにしても分かりにくいエラーメッセージ...ATCResultとはどこにも書いていない