質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

解決済

C++/CLIからC#のクラスライブラリに実装したメソッド「public int Finalize()」を呼び出したい

ricald21
ricald21

総合スコア10

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

2回答

0グッド

0クリップ

325閲覧

投稿2022/11/22 10:07

前提

  • Visual Studio 2013で、C#のクラスライブラリをC++/CLIから呼び出すプログラムを作成しています。
  • C#のクラスライブラリ側に実装したメソッド「public int Finalize()」をC++/CLIから呼び出したいのですが、エラー「C2039」が出ており困っています。

実現したいこと

  • C#のクラスライブラリ側のメソッドを次のように変更すると呼び出せる事は確認出来ています。
    • 「public int Fin()」等、メソッド名を「Finalize」以外にする。
    • 「public int Finalize(int param)」等、引数を設定する。
  • ただ、諸事情があり可能であればC#側のメソッドは変更せずに「public int Finalize()」の形式のまま呼び出したいです。
  • もし、「public int Finalize()」の形式のまま呼び出す実現方法があれば教えていただきたいです。

発生している問題・エラーメッセージ

エラー「C2039」の詳細なエラーメッセージは次の通りです。

ConsoleApplication1.cpp(9): error C2039: 'Finalize' : 'ClassLibrary1::Class1' のメンバーではありません。 c:\xxx\classlibrary1\bin\debug\classlibrary1.dll : 'ClassLibrary1::Class1' の宣言を確認してください。 代わりに、finalizer, '!Class1' を呼び出さなければなりません

該当のソースコード

C#側のソースコード

C#

1namespace ClassLibrary1 2{ 3 public class Class1 4 { 5 public int Finalize() 6 { 7 return 0; 8 } 9 } 10}

C++/CLI側のソースコード

C++/CLI

1using namespace System; 2using namespace ClassLibrary1; 3 4int main(array<System::String ^> ^args) 5{ 6 auto class1 = gcnew Class1(); 7 return class1->Finalize(); 8}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

2

Finalize()はファイナライザとして使う用途なので、一般メソッドとしてファイナライザでないFinalize()を定義するのは間違いです。(し、使えないようにガードがかかっているわけです)

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#1413-finalizers
14.3.10.5 Member names reserved for finalizers
For a class containing a finalizer (§14.13), the following signature is reserved:
void Finalize();

どうしてもFinalizeという名前がいいなら、ダミーの引数を与えるなどしてオーバロードすることはできます。

csharp

1 public class Class1 2 { 3 public int Finalize(int dummy) 4 { 5 return 0; 6 } 7 }

投稿2022/11/22 13:36

matukeso

総合スコア1425

ricald21, draq👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ricald21

2022/11/22 18:55

ありがとうございます。当該メソッド名がファイナライザとして予約されているという事が理解出来ました。C#側のメソッド名を「Finalize」以外に変更する方向で進めていこうと思います。
Zuishin

2022/11/24 11:50

void Finalize() を定義してはいけませんが、それは定義したクラスでは特に問題はありません。 問題が出るのは該当メソッドを定義したクラスから派生するクラスです。 これらは新しい Finalize をファイナライザと誤認します。 派生しなければ問題ないため、エラーではなく警告止まりです。 質問のコードの場合はそもそも戻り値が違うために派生クラスから誤認されることはありません。 従って警告も出ません。 C# 側では行儀が悪い以上の問題のあるコードではなく、問題は C++ 側にあります。 C++ から C# のインデクサーやジェネリックを扱うときにも同様の問題が発生する可能性があるため、質問の問題とこの回答は少しズレているように思います。

1

ベストアンサー

C++/CLR 側でコンパイルエラーが出るのであれば C# 側でも出してほしいですね。
とりあえず、リフレクションで呼び出せるみたいです。

C++/CLR

1using namespace System; 2using namespace ClassLibrary1; 3using namespace System::Reflection; 4 5int main(array<System::String ^> ^args) 6{ 7 Class1^ o = gcnew Class1(); 8 Type^ t = o->GetType(); 9 MethodInfo^ mi = t->GetMethod("Finalize"); 10 int value = (int)mi->Invoke(o, gcnew array< Object^>(0)); 11 return 0; 12}

投稿2022/11/22 17:59

KOZ6.0

総合スコア2243

ricald21👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ricald21

2022/11/22 19:06

ありがとうございます。まさにコメントいただいている通りで、全てC#で実装した場合だと問題無く動作するため質問に至りました。リフレクションだと呼び出せる事も理解いたしました。 リフレクションを使うかは悩ましいところですが、最終的にどう実装するかは慎重に検討した上で判断しようと思います。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです