Hallo und willkommen,
der DllImport bei der globalen Funktion funktioniert, weil diese entweder mit einem C-Compiler übersetzt wurde oder aber bei C++ zusätzlich noch innerhalb von
extern "C" { ... } steht, d.h. da findet dann kein
Name Mangling statt und der Funktionsaname kann 1:1 von C# aus übernommen werden (Beispiel:
Import function from unmanaged C++ DLL).
Eine Klasse bzw. (nicht-statische) Klassenfunktion kannst du nicht direkt benutzen, da du den genauen "gemangelten" Namen dafür benötigst, s. z.B.
Using Unmanaged C++ Libraries (DLLs) in .NET Applications.
Eine m.E. bessere Alternative ist die Verwendung von
C++/CLI zur Erzeugung einer Interop-Assembly, s. z.B.
How to Marshal a C++ Class ("Solution B: Create a Bridge DLL in Managed C++"). [Evtl., wenn du C bzw. C++ kannst, wäre auch "Solution A: Create Bridge Functions in C and Use PInvoke" möglich - ein weiteres Beispiel dafür gibt es unter
using a class defined in a c++ dll in c# code]
Dort kannst du direkt native und .NET-Funktionalität mixen. Aber auch dort würdest du sinnvollerweise die ".lib"-Datei benötigen (sonst hast du per
LoadLibrary und
GetProcAddress dasselbe Problem bzgl. Name-Mangling!).
Wie wird denn bisher die DLL benutzt?