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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#1

投稿記事 by h2so5 » 13年前

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のプロジェクトは入っていません。
特に設定なしにビルドを開始できると思います。
添付ファイル
cli_test.zip
C#プロジェクト(DLL付き)
(100.63 KiB) ダウンロード数: 155 回

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

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

#2

投稿記事 by へにっくす » 13年前

Visual Studio 2012 Express Windows Desktopで開いてビルドしてみましたが同じエラーが出ます。
一応報告まで
written by へにっくす

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#3

投稿記事 by h2so5 » 13年前

へにっくすさん、ありがとうございます。

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

C++

コード:

enum ATCResult {
    ...
};


C++/CLI

コード:

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

閉鎖

“C言語何でも質問掲示板” へ戻る