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:

    http://stackoverflow.com/questions/23295906/badimageformatexception-when-using-c-cli-in-a-c-sharp-application

    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.

    http://stackoverflow.com/questions/27714617/reference-c-cli-class-library-compiled-dll-in-c-sharp-project

    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").


Anmelden zum Antworten