Repository navigation
Expand file tree
/
Copy pathFS-XML.cs
More file actions
68 lines (53 loc) · 2.58 KB
/
Copy pathFS-XML.cs
File metadata and controls
68 lines (53 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class FSXMLLauncher {
// Èìïîðò ôóíêöèé èç WinAPI äëÿ çàãðóçêè áèáëèîòåê
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
// Îïèñûâàåì ñèãíàòóðó ôóíêöèè Py_Main èç python312.dll
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private delegate int Py_Main(int argc, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv);
[STAThread]
public static void Main() {
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
// Êîððåêòíûé ðàáî÷èé êàòàëîã
Directory.SetCurrentDirectory(baseDir);
string pythonDir = Path.Combine(baseDir, "python");
// Óêàæèòå òî÷íîå èìÿ âàøåé DLL (íàïðèìåð, python312.dll èëè äðóãóþ âåðñèþ)
string dllName = "python312.dll";
string pythonDllPath = Path.Combine(pythonDir, dllName);
if (!File.Exists(pythonDllPath)) {
MessageBox.Show("Êðèòè÷åñêàÿ îøèáêà: Íå íàéäåí ôàéë " + dllName + " â ïàïêå 'python'.", "FS-XML");
return;
}
// 1. Äîáàâëÿåì ïàïêó python â ïóòè ïîèñêà DLL
SetDllDirectory(pythonDir);
// 2. Çàãðóæàåì áèáëèîòåêó Python
IntPtr hPython = LoadLibrary(pythonDllPath);
if (hPython == IntPtr.Zero) {
MessageBox.Show("Íå óäàëîñü çàãðóçèòü ÿäðî Python èç " + dllName, "FS-XML");
return;
}
// 3. Èùåì òî÷êó âõîäà Py_Main
IntPtr pPyMain = GetProcAddress(hPython, "Py_Main");
if (pPyMain == IntPtr.Zero) {
MessageBox.Show("Îøèáêà: Â DLL íå íàéäåíà ôóíêöèÿ Py_Main.", "FS-XML");
return;
}
Py_Main runPython = (Py_Main)Marshal.GetDelegateForFunctionPointer(pPyMain, typeof(Py_Main));
// 4. Ôîðìèðóåì àðãóìåíòû
string[] args = new string[] { "FS-XML.exe", Path.Combine(baseDir, "main.py") };
try {
// Âûçîâ èíòåðïðåòàòîðà âíóòðè òåêóùåãî ïðîöåññà
runPython(args.Length, args);
} catch (Exception ex) {
MessageBox.Show("Îøèáêà âûïîëíåíèÿ ñêðèïòà: " + ex.Message, "FS-XML");
}
}
}