From e4a026c695f87c59b1241dc38877bcb5658d4fe7 Mon Sep 17 00:00:00 2001 From: lrs2187 Date: Fri, 2 Jan 2026 19:08:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20C#=20IPC=20=E5=BF=98=E8=AE=B0?= =?UTF-8?q?=E5=9C=A8=20sys.path=20=E6=B7=BB=E5=8A=A0=20dlls=20=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/IPC_URL/csharp_ipc_handler.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/common/IPC_URL/csharp_ipc_handler.py b/app/common/IPC_URL/csharp_ipc_handler.py index ead1c6ce..4c34343a 100644 --- a/app/common/IPC_URL/csharp_ipc_handler.py +++ b/app/common/IPC_URL/csharp_ipc_handler.py @@ -1,3 +1,4 @@ +import sys import asyncio import threading from typing import Optional @@ -8,6 +9,9 @@ CSHARP_AVAILABLE = False try: + # 添加 dlls path + sys.path.append(str(get_data_path("dlls"))) + # 导入 Python.NET from pythonnet import load @@ -29,8 +33,9 @@ from SecRandom4Ci.Interface.Models import CallResult, Student CSHARP_AVAILABLE = True -except: +except Exception as e: logger.warning("无法加载 Python.NET,将会回滚!") + logger.warning(e) if CSHARP_AVAILABLE: From aee8a06214a95632d3acd56294272eb310a40099 Mon Sep 17 00:00:00 2001 From: lrs2187 Date: Fri, 2 Jan 2026 20:32:56 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20C#=20IPC=20?= =?UTF-8?q?=E6=8E=89=E7=BA=BF=E9=87=8D=E8=BF=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/IPC_URL/csharp_ipc_handler.py | 30 +++++++++++++++++++++++ data/dlls/SecRandom4Ci.Interface.dll | Bin 9728 -> 9728 bytes data/dlls/SecRandom4Ci.Interface.pdb | Bin 17820 -> 18508 bytes 3 files changed, 30 insertions(+) diff --git a/app/common/IPC_URL/csharp_ipc_handler.py b/app/common/IPC_URL/csharp_ipc_handler.py index 4c34343a..9aad8f33 100644 --- a/app/common/IPC_URL/csharp_ipc_handler.py +++ b/app/common/IPC_URL/csharp_ipc_handler.py @@ -65,6 +65,7 @@ def __init__(self): self.ipc_client: Optional[IpcClient] = None self.client_thread: Optional[threading.Thread] = None self.is_running = False + self.is_connected = False def start_ipc_client(self) -> bool: """ @@ -102,6 +103,11 @@ def send_notification( settings_group=None, ) -> bool: """发送提醒""" + if not self.is_running: + return False + + if not self.is_connected: + return False if settings: display_duration = settings.get("notification_display_duration", 5) @@ -172,17 +178,40 @@ async def client(): task = self.ipc_client.Connect() await loop.run_in_executor(None, lambda: task.Wait()) + self.is_connected = True while self.is_running: await asyncio.sleep(1) + if not self._check_alive(): + logger.warning("C# IPC 断连!重连...") + self.is_connected = False + + task = self.ipc_client.Connect() + await loop.run_in_executor(None, lambda: task.Wait()) + self.is_connected = True + + logger.info("C# IPC 重连成功!") + self.ipc_client = None + self.is_connected = False # 启动新的 asyncio 事件循环 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(client()) loop.close() + + def _check_alive(self) -> bool: + """客户端是否正常连接""" + try: + randomService = GeneratedIpcFactory.CreateIpcProxy[ISecRandomService]( + self.ipc_client.Provider, self.ipc_client.PeerProxy + ) + return randomService.IsAlive() == "Yes" + except Exception as e: + logger.warning(e) + return False else: class CSharpIPCHandler: @@ -210,6 +239,7 @@ def __init__(self): self.ipc_client = None self.client_thread = None self.is_running = False + self.is_connected = False def start_ipc_client(self) -> bool: """ diff --git a/data/dlls/SecRandom4Ci.Interface.dll b/data/dlls/SecRandom4Ci.Interface.dll index cff937914dc6e8f03019d35779b18f0230285a30..89d9768c2315d78390f63e84fe8b43a88c63182e 100644 GIT binary patch delta 3955 zcma)9dvH|M9sbU_ckkY8$Y!%4PeRx=Q9{755t7i6SYsG4l^_VHR7H|yfoLScqE#r_ zM0{bPlX!Ki)!y64>OTiCa7;9mRq%CgggJ1X?C=D~eehWna<%fahn;9F}jUN~VDFoFEexxg|n zu4i~F)Kq<9vUi8-Eqj*U=DL)(MgXPNKzAviye}%7yv6!d_>_(p4$nB+ck@#y*;(ba zTjyjp?g4JDnF55)t9?Vq?|2r`t8vr4uF*{QBO}?!84_uT)pNcd$p%Pd z#)KM^?#(f(vCsk%7Oj&|L#&>eekj{_rl_&#-jLCZMMg;&nUF|Bte$#5(l&m6bB#s! z=5l)c(4)Hd0{Uh9k)Guh2V$AoRB$M^6w>QVYYZ80O~54Za~g~8<@y+J%|wzjgJ;P2 z;5o+6k2DtDn`bm*{U`!5CbU61LdMWWzazo3LXAcDhR=kq@%teuOSX!+W_GqCHBIK( zsJEDa9mSspip)QAZ zh?CT+-eO2T%%DaP&UuTa@@1$a7Bc6tl9~EoJy-GQF!v3LJ9AkShSo(BeHLY)svkYnWdLyvSU3V5s+Uu3Z zMR8*tRZD2o*zB`<+AKUJ?C#Qi93czO3i}=Q2RG7YbLR!JHX9SN%w4Y5D;pDimgG2P zY|QuR^TFFx0E>L~hu|G#eLnl6yOTY+*JmHNimT&ApUn&msvutTS!>`yvM;ktn&zUW zN*d$7kDbaz!e^gwlH3eBefndzEeALFYzNzxgGYV#W$+Od!V^CGPjDC6@hp=Px%k_6 z*lA(gP>gjd7f!V)zYWu{Tbc7wVSpz=7BhfS3+`j1G09{W;N6|G+}gFBJVUk(Y^lt;pAk+@-#9i`8n$^H0HUv36&~{DP=9 z5idiWJJdZ^96!f^buQ9asiq={H|=TIf)A}}_zB*#>X3`qRUO~;qr^%0j97)Qh|{?r z)?pSF6EDPd#8%uuyiD{<1+T#_-6B<5kTGRiaU=vKh*pHvuyG6g7o)6o5#ec8(kBELm{11!&VevmK`orRXMEsA?Kl7e7Duz)B z_(%dil75^Nr<0OYDKjZbnbES887)hh(Ta;cF8V4p%+YEQO^aw&sl!-gb%>@zH2os? zi+rbIH!}9)bXsW*iD5_#BO;H8JgQz|Ql$;X1zQ9=1p5Vt1P|%MxWyXLrdbd2xaQ^} zr^Z^fUxB;-uZg4X3&aJ1mx-rf3B5xj`w_y(@Z&!{pE zVvVx<%qDd9HG|aOX+&M8_KJf(+X=rH_CJ2y%1rFIXOk+EWB9v%5AmCZ->5lkVGHg; z8=gZu?(%+=UpH-Td&j2ay7tsfovDrKi#o5rz8>>$S)W{0k43k1cXxDlrzkG#NZ&Yo zApg&n_x7ZicTY*wX-l_scilRCU*Rz;xHh%v`YTdt@9L71-uFun#q-;^s#?&EF5Jp* z1fcD}MfdI6b9%wSs&6LldgaRXUZiZE?GzQ4_&J2~1X zIxD2Yjwr)+j8k9-RkS)t#U2%{2*k9iD4mc{TIGtW5_X9C5XoM}+$tOyGiG@uOtJ$i z%#T133K5KH?HwwcIP-v_<}MYDWnJ9tBTqYFQ*Yd$1CrVMSJ{+|(Q3!l4&AinL?hhX zd0Cv^KuobIRt#a0A~`Wr(FBBO@kN?l-g!1vc@(q}bdav5@m3ALh-${d$Xwoeyfu$x zGrQi-@@lQ&4VSOXouClBBGsMhNTh4NVP+S+hDiQ;iKx^{F|lJClhua~hfw zYZ9~PG$c}UlAXzh)eYV?lYZkBRtzfT?Wy>B78>V%JPOsmSTlV;?-Trcd4m7<#xB!8 zeokX5?-l%)xnhcUbn-coqPtseJN3#lEyI5*`n%3A*nEFw>zUSET3K7?+xy4trp%`^ zJH9-0=%%9!rY~Rrr2mK2lzFY$d%Ut-KiljbtgP|=S~+((99w0zr_g{V-U-a&uLGT2 wSB;{pr!)tvsY%khhO+TAQi7+PVF~d_ibn%I8@!jQ+V#85!v)o!tHDI@zqz5m3jhEB delta 3784 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 ISq=dI2Gcz;;{X5v delta 2478 zcmb7Gd011&7N2_qN!Y@c1Z0NifAszF?w8-3b7szO&Y3xrxp(j| zR$Yu8b|MsL2=Q_dngYp2poi^97pEp?fQpcU?1y;aVMqb=lhDQU3-|X0Sqt_bLaQIKp_Q@$M=+uR z_Nv8{q9Hde96i^jAtoC~tsENa=ismc zBF5wGLZz31vm$2 z65?n=NX@B=W`yJ{X5y)Ulwl3jCLrVqpv&3RUNVs)tZ!+Y+A<|M+nw~pjWKsJO4erM z#t!b_p#j_a7sCl`O*sZNgO;4_PF|I9r*UI~;_Aq8O~GCU+59yZRRii-$^}FEUQ{XJ zNKr=!=A=e`@uDIy0n{15kgbp^ttvnbUabv?8O>ant(ouCJ6RX}UVJ}K*I2YrI`t4tT-6f0NO z_R3mvj^<`E#npWmU9S;X^fJvqp};9tf5QQmg*bIhYvX~YHJUHpk^u@rldnQ!BzFZN7Qa=|H!)t4OqMHp(inLxazxRTOrm>$zJ;u#n_?DZjiL@&&oJOK z^7>7rwqNueiG3M)cD8lLtR?Lly*KmHvu__`=LY#fd!>y`GE%9I!N@ns_sc)f!c=~$ zuw)bwEw5O@_eQa_#Yg)!zBF=Zu;l};4UJ%w4VL|OM1_5Rv(KQixgL9hbvs?D!7)r^ zLEOpPHwy(U3Aw$F=Ae-sbBoY@)mo_69{%Aa_72--_2{PV{YM>+wGX8<^Tpe2UnhF~ z;r}+jwuAHfvNIocAFKh0|6oHMD4*ltz2DqijLb5 znOeI>2l?NSt0LMK_W$xF_spt({y>|hyKm6cI5U)JcA0ZdoAKaG#ib|}{={3zopC;T ze{F)#1>YcIf8UVVA%u)>ZvC!gsP;|z@=@&@`g`K8R$WdONqaVCmws_eEl}!mB4B`=He-Xmyur{?;#}zxlV32iNs^0`t%aUbnCw~E5EB)qZoNA!(MlC)6Gv# z?3P}R8N938P7~aE%=-3rzF~^9IJ-e3jMry(a6)%Q(fpot?FXc4c|=`oWpK;PJ5x?P zO4fLEbMnd>{^KbR_khwH4L7BB3%6g}UVlzsO_vQ*YVm?l}Eq# zn|-sb$?N;z`TxeO_$+VNFjc3+6I7iFf7e+s{5*Pkwc2?On^2y%3Oyxi*kzU&@NbuY z23BkykEjcNSXeq~-M_G5N_2IEpYgD&dj8F#Gi#jXweL>4bGY3NT=d$Ot zZI|!UZ=Nh8{3mw5JhQy|%20Z1@SIU&df)a7qAM#Gb&m2c29=GSkGS7)@#9#lw~>99 z`?amM72U%we^PgdSFBj5Wj>v7WysF}Lmn5llnaujbN5Q`MTmEHPfs}g+Hz_#rrwK3 zJ{sDa_3F9K*N=YWR53e-!fR^VNy)(JV_l?ro7+!^d@YD(n$rVjsd~$}-UaJTT(z|Y zroFM($2y}Ir;g5ziU&TWR~0_(C^nR2?2j@JtGVHBA+7BV?BCPKvzX^(=Nzd?T6__5C)L2^Nvv4eRysabY;f?Kv-U1O2Wa*D zBeXNcZuazV8#Q|dE2brmf&b|^|8OAP$Zy`5^e|k>ko|kgD_SIm_L!Y>T#}>9DuH0L zz+tn%Y1K+sS9|+7`-B9Cq(ny-XGe#Gc*leUfnbG|S$1~*$Kpa%gjCEbbx^7}!_pz>dtXqM6DzZ`2pe{}|B@AWZOn1_F zjf61zTW73073)5Qb@ymf7qS|{Sip(GnFa{Mcf+Ml$KVOU=`g6wV%xwG!Zg(|lz=ng zrAh-QxSliVOjV?f!-f1A9d2nL!m9|_IGdtr^4WGkBQQ(g