- PR -

リンク ファイルとして関連付けを行った型定義の扱いについて

1
投稿者投稿内容
Astaroth
会議室デビュー日: 2003/03/12
投稿数: 9
投稿日時: 2003-10-28 13:51
すみません、詰まってしまったので教えて下さい。

現在、VB.Netで共通関数集の作成を行っています。
共通関数集は、いくつかの種類によりDLLファイルになるわけですが、
ユーザ型の定義や列挙体については共通で使用するものもあります。

そこで、モジュールファイルに作成した列挙体を、他のクラスライブラリ
のプロジェクト内でリンクファイルとして紐付けを行い、クラスモジュール
内で、関数の引数や変数の型定義に使ってみたところ、
関数内の変数の宣言時に使用する事は出来ましたが、クラスモジュール内
のPublic変数の宣言時や、Public関数の引数の型に指定すると、

'enumType' は、Public class 'clsSample' の外にある Friend 型を公開できません。
と、コンパイルエラーになってしまいます。
( Friend ではなく Public なんですけどね・・)

Public変数・関数をPrivate等に変えて宣言すれば、エラーは出ませんが、
共通関数として他のプロジェクトから呼び出す事は出来なくなってしまい
ます。

1.リンクで関連付けを行った型定義は、プロジェクトの外に漏らさないという
  観点から、型定義が外に漏れない宣言しか行えないのでしょうか?
  (クラスライブラリ側から見た場合)
2.上記の回避策は、クラスライブラリ側で定義しておいて、他のプロジェクトから
  参照設定を行った後に、クラス内部の型で変数・引数の型定義を行うか、同じ型
  定義のモジュールファイルを、プロジェクト別に作成して管理するしかないの
  でしょうか?(これが嫌で上記の事を行いたかったのです)

どなたかご教授をお願いします。



※以下、サンプルソースです

'=================================================
'モジュールファイル
'(クラスライブラリにリンクファイルとして紐付け)
'=================================================
Module mdlSample

Public Enum numType As Integer
INP_CODE 'コード
INP_DATE '日付
INP_DECP '小数点含む値
INP_NUMP '整数値
INP_STR '文字型
End Enum

End Module

'=================================================
'クラスファイル
'=================================================
Public Class clsSample

Public Function cfnc_SampleCheck(pnumType As numType) As Boolean
' ↑これをPrivate等に変えると、エラーは出なくなりますが外部から
'  呼び出せません(当然ですが)

Select Case pnumType
Case numType.INP_CODE
cfnc_SampleCheck = True
Case numType.INP_DATE
cfnc_SampleCheck = True
Case Else
cfnc_SampleCheck = False
End Select

End Function

End Class
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-10-28 14:14
Enum の部分を Module の外に書いてみてはどうでしょうか?
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-10-28 14:21
引用:

'enumType' は、Public class 'clsSample' の外にある Friend 型を公開できません。
と、コンパイルエラーになってしまいます。
( Friend ではなく Public なんですけどね・・)



'enumType'は'numType'ですよね?

モジュールmdlSampleの内部の列挙型numTypeは、
正確には、mdlSample.numTypeという型です。
ModuleもEnumもクラスの一種で、numTypeはmdlSampleの内部クラスです。

で、mdlSample型はアクセス修飾子の指定がないのでFriendスコープです。
その内部クラスのnumTypeはアクセス修飾子にPublicが指定されていますが、
Friendスコープの中でのPublicのため、Friendスコープになりますので、
mdlSample.numType型は他のアセンブリ(EXE、DLL)からは見えません。

単純にnumType型の宣言をmdlSampleの外に出して、
mdlSample.numType型ではなくnumType型とすればよいでしょう。

詳しくは下記のURLのVisualBasic言語仕様、リファレンスをご覧ください。

4.6 アクセスの種類
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbls7/html/vblrfVBSpec4_5.asp

Module ステートメント
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vakeymodule.asp
Astaroth
会議室デビュー日: 2003/03/12
投稿数: 9
投稿日時: 2003-10-28 14:36
>>架空兎 さま
>>よねKEN さま

有難うございました。
EnumをModuleの外にPublic宣言する事で、綺麗に解決しました。
既存のModule宣言内に書いたのではダメですよね。納得です。

>'enumType'は'numType'ですよね?
そうです。失礼しました。
1

スキルアップ/キャリアアップ(JOB@IT)