Zetknąłem się z podobnym problemem - w moim przypadku mamy napisać plugin do aplikacji napisanej w Delphi (aplikację dostarcza zewnętrzna firma - nie mamy na nią wpływu). Osobiście w Delphi pisałem dawno, a całą technologię w firmie mamy przestawioną na C# -> nie ma szans na zrobienie tego co potrzebujemy w Delphi.
Podobnie jak u kolegi - dostaję błąd "~Zewnętrzny wyjątek E0434352"
Podobnie jak On - w VS2017 używam modułu UnmanagedExports. W assembly information projektu ustawiłem "Make assembly COM-Visible". Projekt jest typu Class Library. Aplikacja Delphi jest x86 - kompiluję również do platformy x86
Kręcę się trochę w kółko. Może walczyliście z tym tematem i potraficie przynajmniej wskazać kierunek.
EDIT: OK. Zrobiłem prostą aplikację testującą moją bibliotekę napisaną w C# i osiągnąłem u siebie dokładnie ten sam błąd, co w aplikacji zewnętrznej). Dobrnąłem przynajmniej do takiego punktu, że Delphi widzi moje funkcje. Na ta chwilę ustaliłem, że problemem są parametry wejściowe i wyjściowe. Delphi przekazuje jako parametr "const p : PChar", a oczekuje zwrotki ze wskaźnikiem do tablicy obiektów "packed records".
zostawiając na chwilę ten wątek - napisałem mały kawałek kodu, którego zadaniem jest przekazanie PChara i oczekiwanie na wynik w takiej samej postaci:
procedure TForm1.Button1Click(Sender: TObject);
var
DLL : THandle;
test1 : function(a:PChar) : PChar;
begin
DLL := LoadLibrary('blbioteka.dll');
try
@test1 := GetProcAddress(DLL, 'test1');
ShowMessage(string(test1('test2')));
finally
FreeLibrary(DLL);
end;
end;
metoda po stronie C# wygląda tak:
[ComVisible(true)]
[DllExport("test1", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static string test1([MarshalAs(UnmanagedType.LPStr)]string s)
{
return s+" "+s;
}
kombinowałem z LPWStr, BStr i chyba wszystkimi innymi typami stringopodobnymi - dostaję albo błędy, albo krzaki w ShowMessage ...