C# + Cli-class-libary-project -> kein Zugriff auf Funktionen der Klasse
-
Hallo Forum,
ich möchte gerne ein Cli-class-libary-project verwenden, um einen C++/C Code über ein C#-GUI zu steuern/auszuführen. In diesem Zusammenhang habe ich folgendes Beispiel mit VS2008 ausprobiert:
http://stackoverflow.com/questions/2211867/how-do-i-call-native-c-from-c
Ergänzend zu den bereits im Thread vorhandenen Angaben habe ich zur Vermeidung der BadImageFormatException noch folgenden Rat befolgt:
Leider weiß ich aber nicht, wie ich auf die Funktionen der C++ Klasse Class1 aus C# zugreifen soll – gegenwärtig werden diese mittels der IntelliSense nicht gefunden und der Compiler sagt:
Fehler 1 "Interface.Class1" enthält keine Definition für "GetText", und es konnte keine Erweiterungsmethode "GetText" gefunden werden, die ein erstes Argument vom Typ "Interface.Class1" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
Im folgenden Thread wird dieses Problem zwar adressiert, aber in meinem Fall scheint das nicht zu funktionieren, bzw. ich habe irgendetwas nicht richtig kopiert.
Hier sind meine Codefragmente:
C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Interface; namespace CsharpInterfaceTest2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { Class1 instance = new Class1(); richTextBox1.Text = richTextBox1.Text + instance.GetText() + "\n"; } } }
Cli/C++
#pragma once #include "windows.h" using namespace System; namespace Interface { public ref class Class1 { static String^ GetText(){ WCHAR acUserName[100]; DWORD nUserName = sizeof(acUserName); if ( GetUserName(acUserName, &nUserName)) { String^ name = gcnew String(acUserName); return String::Format("Hello {0} !", name); }else{ return gcnew String("Error!"); } } }; }
Hat jemand hier vielleicht eine Idee ?
-
Statische Methoden werden immer über den Klassennamen aufgerufen:
Claas1.GetText();
Oder eben das 'static' entfernen.
-
Hallo Forum
Danke für die Antwort - das static ist leider nicht das Entscheidende:
http://stackoverflow.com/questions/31957957/extension-method-in-a-portable-class-library-is-not-visible-in-asp-net-mvc-views
Möglicherweise gibt es ja doch erhebliche Unterschiede zwischen dem VS2010 und dem VS2008 was Funktionen ohne explizite Deklaration public/private angeht.Man muss wohl public: davorschreiben:
#pragma once #include "windows.h" using namespace System; namespace Interface { public ref class Class1 { public: String^ GetText(){ WCHAR acUserName[100]; DWORD nUserName = sizeof(acUserName); if ( GetUserName(acUserName, &nUserName)) { String^ name = gcnew String(acUserName); return String::Format("Hello {0} !", name); }else{ return gcnew String("Error!"); } } }; }
-
Ok, das hatte ich nicht gesehen (Klassen in C++ [bzw. C++/CLI] haben als "default access modifier" "private").