Ich versuche, eine C++ DLL aus meinem C# -Programm zu entladen und dann neu zu laden und ihre Funktionen zu verwenden. für das Entladen Teil benutzte ich diese Antwort: Unload a DLL loaded using DllImportC# Pinvoke und Neuladen einer DLL
Um es neu zu laden ich die Funktion Loadlibrary verwendet. Dies ist mein Code:
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
internal class Program
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);
[DllImport("TestLibrary.dll", SetLastError = true)]
private static extern int GetValue();
private static void Main(string[] args)
{
int val = GetValue();
IntPtr p2 = LoadLibrary("TestLibrary.dll");
bool isFree = FreeLibrary(p2);
isFree = FreeLibrary(p2);
p2 = LoadLibrary("TestLibrary.dll");
val = GetValue();
}
}
}
Das Seltsame ist, dass pinvoke noch funktioniert, wenn ich das Modul neu zu laden.
Soll das Modul nicht in einen anderen Teil des Speichers geladen werden?
Kann ich es so machen, wie ich es getan habe, oder werde ich Probleme damit haben?
Meinten Sie "Marshal.GetDelegateForFunctionPointer"? :) – Idov
Ja tat ich. Gehirn einfrieren. –