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

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

新規登録して質問してみよう
ただいま回答率
85.47%
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の次のバージョンです

Q&A

解決済

2回答

1105閲覧

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

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の次のバージョンです

0グッド

0クリップ

投稿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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ricald21

2022/11/22 18:55

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

2022/11/24 11:50

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

0

ベストアンサー

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

総合スコア2628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ricald21

2022/11/22 19:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問