F
Ok, habs gelöst. Der Hinweis zu der o.g. Seite hat mich zu dem Tool "P/Invoke Interop Assistant" gebracht. Vom Prinzip her macht es genau das umgekehrte, wie dass, was ich wollte. Es liefert mir zu P/Invoke C#-Code das C-Pendant und noch Bewertungen der verwendeten Datentypen dazu.
In diesem Zusammenhang kam der Hinweis, das man für in/out Parameter vom Typ char* doch lieber StringBuilder verwenden soll.
public class CMyClass
{
#region P/Invoke DLL imports
[DllImport(@".\DLL\mylib.dll", EntryPoint = "SETUPdll", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
private static extern void SETUPdll(ref int i, StringBuilder hfld, StringBuilder hfmix, StringBuilder hrf, ref int ierr, StringBuilder herr, int ln1, int ln2, int ln3, int ln4);
#endregion
public CMyClass()
{
}
public void Setup(string[] saComponents, string sCoefficients, string sRefState)
{
int iCountComponents = saComponents.Length;
StringBuilder sbComponents = new StringBuilder(string.Join("|", saComponents), 10000);
StringBuilder sbCoefficients = new StringBuilder(sCoefficients, 256);
StringBuilder sbRefState = new StringBuilder(sRefState, 256);
StringBuilder sbError = new StringBuilder(256);
int iError = 0;
SETUPdll(ref iCountComponents, sbComponents, sbCoefficients, sbRefState, ref iError, sbError, 10000, 255, 3, 255);
}
}
Sehr wichtig ist in diesem Zusammenhang auch die Tatsache, dass man die StringBuilder Objekte mit Werten für die festen Längen initialisieren muss.