DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ソリューションに複数プロジェクトを追加したときエラーが発生する

環境/言語:[NET Framework2.0]
分類:[.NET]

複数のプロジェクトを1つのソリューションにまとめたとき、
「sub 'Method2' はベース class の sub をオーバーライドしないため、
 'Overrides' として宣言することはできません。」
のエラーが発生して、その対処に悩んでおります。
お分かりの方がいらっしゃったら対処方法を教えてください。

環境:
WindowsVista
Visual Studio 2005
Visual Basic 2005
.Net Framework 2.0

再現の手順とすると、
1.ソリューションに
 プロジェクト1(WindowsApplication1):クラスライブラリ
 プロジェクト2(WindowsApplication2):Windows アプリケーション
 プロジェクト3(WindowsApplication3):Windows アプリケーション
 の3プロジェクト追加します。
2.プロジェクト1の参照設定に[Microsoft Excel 9.0 Object Library]を追加
3.プロジェクト1に下記の内容でクラスを追加する。
==================================================
 Public Class BaseClass
 Protected Overridable Sub Method1()
  End Sub
 Protected Overridable Sub Method2(ByRef aVal As Excel.Application)
  End Sub
  Protected Overridable Sub Method3(ByVal aVal As String)
  End Sub
 End Class
==================================================
4.プロジェクト2の参照設定に[Microsoft Excel 9.0 Object Library]を追加
5.プロジェクト2でプロジェクト1のDLLを参照設定に追加する
6.プロジェクト2に下記の内容でクラスを追加する。
==================================================
 Public Class SubClass1 : Inherits WindowsApplication1.BaseClass
  Protected Overrides Sub Method1()
  End Sub
  Protected Overrides Sub Method2(ByRef aVal As Excel.Application)
 End Sub
 Protected Overrides Sub Method3(ByVal aVal As String)
  End Sub
 End Class
==================================================
7.プロジェクト3の参照設定に[Microsoft Excel 9.0 Object Library]を追加
8.プロジェクト3でプロジェクト1のDLLを参照設定に追加する
9.プロジェクト3に下記の内容でクラスを追加する。
==================================================
 Public Class SubClass2 : Inherits WindowsApplication1.BaseClass
  Protected Overrides Sub Method1()
  End Sub
  Protected Overrides Sub Method2(ByRef aVal As Excel.Application)
 End Sub
 Protected Overrides Sub Method3(ByVal aVal As String)
  End Sub
 End Class
==================================================

この状態で、ビルドすると冒頭に書いた、
「sub 'Method2' はベース class の sub をオーバーライドしないため、
 'Overrides' として宣言することはできません。」
が発生してしまいます。

これが、ソリューションにプロジェクト1とプロジェクト2
もしくはプロジェクト1とプロジェクト3
の組み合わせなら問題なくビルドすることが出来るので、
文法レベルのエラーではないとは思うのですが。。。
なにか根本的に間違っているのでしょうか?

お分かりの方がいらっしゃったら教えてください。
よろしくお願いします。
文法レベルの問題はないかもしれませんが、Office の COM 参照のやり方に問題の種はあるように感じます。

Excel.Application という同じ名前ですが、それぞれのプロジェクトで参照設定をして自動生成しています。
このため、コンパイルの順序などによって、それぞれのプロジェクトで Excel.Application という同じ名前で違う型と認識される型が複数生成されているのかもしれません。


PIA のある Office のバージョンであれば、PIA を利用してください。
PIA がない Office のバージョンであれば、tlbimp.exe を用いて代替相互運用アセンブリを手動で作成し、3 つのプロジェクトともに生成された同じアセンブリを利用するようにしてみてください。
■No27313に返信(Azuleanさんの記事)
可能ならCreateObject等で参照設定しないでExcelのオブジェクトを作成した方がいいかもしれません。ある程度のExcelバージョン違いも吸収できるし。
Azuleanさん

返信ありがとうございます。

ソリューションに含めるプロジェクト次第で上手くいったりするので、
文法に問題ないはずだよなぁ…と思ってますけど、

>このため、コンパイルの順序などによって、それぞれのプロジェクトで
>Excel.Application という同じ名前で違う型と認識される型が複数生成されてい
>るのかもしれません。

は、ソリューションのビルド順序が
プロジェクト1->プロジェクト2->プロジェクト3のときは、
プロジェクト2がエラー対象になり、
プロジェクト1->プロジェクト3->プロジェクト2のときは、
プロジェクト3がエラー対象に変わるので、
何かあるかも。。。
って気がしてきます。

> PIA のある Office のバージョンであれば、PIA を利用してください。
> PIA がない Office のバージョンであれば、tlbimp.exe を用いて代替相互運用
> アセンブリを手動で作成し、3 つのプロジェクトともに生成された同じアセンブ
> リを利用するようにしてみてください。

まずは、tlbimp.exeを使って試してみます!

情報ありがとうございました!!
shuさん

返信ありがとうございます。

今回は、出来るだけ元のプロジェクトには手を加えずに
1ソリューションにまとめて管理出来るようにしたいので、
Azuleanさんに示していただいた「tlbimp.exe」を試してみて、
それでダメならCreateObjectを使って見ようかと思います。

情報ありがとうございました!
Azuleanさん
shuさん

各プロジェクトの参照設定から
[Microsoft Excel 9.0 Object Library]を取り除き、
代わりに、tlbimp.exeから作成されたDLLを加えることで、
エラーが発生しなくなりました!

ホントに助かりました。
情報ありがとうございました!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板