Ich habe eine Konsolenanwendung in C# geschrieben. Sie lässt sich bauen und ausführen, aber bei der Ausführung der Methode Run() tritt ein Fehler aus, den ich nicht beheben kann: "System.IO.FileNotFoundException: "Could not load file or assembly 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Das System kann die angegebene Datei nicht finden."" Ich habe versucht, System.Drawing.Common als externe dll herunterzuladen, aber es scheint sie nicht zu geben. Ich werde auch aus dem Fehlerstack beim Debuggen nicht schlau:
"Interceptor.exe" (CoreCLR: clrhost): "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0\System.Collections.Specialized.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
Ausnahme ausgelöst: "System.IO.FileNotFoundException" in System.Windows.Forms.dll
Ein Ausnahmefehler des Typs "System.IO.FileNotFoundException" ist in System.Windows.Forms.dll aufgetreten.
Could not load file or assembly 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Das System kann die angegebene Datei nicht finden.
[...]
Ich habe meine Windows.Forms dll (die neuste Version) von hier: https://xxxxxxxxxxxxxxxxxsystem.windows.forms.dll.html
Hier der Code:
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
Du solltest dich ein wenig mit der .NET-Infrastruktur befassen: [FAQ] Das .NET Ökosystem - .NET, .NET Core, .NET Standard, NuGet und Co
Bei .NET sollte man keine (System-)Assemblies manuell einbinden, sondern per NuGet (damit auch alle abhängigen Assemblies referenziert werden).
Für dich sollte es jedoch reichen folgendes in die Projektdatei einzutragen:
<UseWindowsForms>true</UseWindowsForms>
Hinweis: ich hab die dubiose Seite, wo Du Deine DLL heruntergeladen hast, unkenntlich gemacht.
Sowas aus irgendwelchen nicht-vertrauenswürdigen Quellen zu laden, ist eine - sorry für die Deutlichkeit - richtig richtig dumme Idee. So fängt man sich Zeugs ein. Das will hier niemand.
Du würdest ja in Java - Du sagtest Du kommst aus der Java-Welt - auch nicht von irgendwelchen Seiten irgendwelche jar-Dateien laden.
Wenn Du mit .NET weiter machen willst, dann solltest Dir wirklich 10-15 Minuten die Grundlagen von .NET durchlesen, wie .NET funktioniert.
Ansonsten wirds echt bisschen schwer mit Try and Error (wie mit jeder anderen Runtime auch).
https://learn.microsoft.com/en-us/dotnet/fundamentals/
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code