C# Windwos服务脱离.Net Framework

解决方案:

1.将C#windows服务改成无窗台的Winform

2.C#的Winform脱离.Net Framework(网上有很多资料,这不讲了)

2.用Delphi编写Windows服务,服务启动时启动C#的Winform程序

3.设置Windows服务“允许服务与桌面交互”

 

部分代码:
1.获取服务文件路径:

 

ContractedBlock.gif ExpandedBlockStart.gif Delphi 获取服务文件路径
 
   
function TBootCssService122.GetServiceAppPath: String;
Var
Res : Longint;
CurSize : Longint;
begin
CurSize :
= 1024 ;
SetLength(Result, CurSize);
Res :
= GetModuleFilename(GetModuleHandle( nil ), PChar(Result), CurSize);
If (res
> curSize) then
begin
CurSize :
= res + 10 ;
SetLength(Result, CurSize);
Res :
= GetModuleFilename(GetModuleHandle( nil ), PChar(Result), CurSize);
end ;
Setlength(Result, Res);
Result :
= ExtractFileDir(Result) + ' \ ' ;
end ;

2.启动C#程序

 
  
WinExec(PChar(GetServiceAppPath + ' VM\VMDoNet.exe '
+ GetServiceAppPath + ' winform文件名 ' ), SW_SHOW);

3.停止C#程序

 

ContractedBlock.gif ExpandedBlockStart.gif Delphi 杀死进程
 
   
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE
= $ 0001 ;
var
ContinueLoop: BOOLean;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result :
= 0 ;
FSnapshotHandle :
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 );
FProcessEntry32.dwSize :
= SizeOf(FProcessEntry32);
ContinueLoop :
= Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName)))
then
Result :
= Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(
0 ),
FProcessEntry32.th32ProcessID),
0 ));
ContinueLoop :
= Process32Next(FSnapshotHandle, FProcessEntry32);
end ;
CloseHandle(FSnapshotHandle);
end ;

 

 
  
procedure TBootCssService122.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
// 杀进程,停止程序
KillTask(
' C#程序 ' ); // 调用函数,杀你的程序abc.exe
Stopped :
= True;
end ;

 

 

转载于:https://www.cnblogs.com/ruanzb/archive/2010/08/06/1794353.html

从四年前刚学C#时就一直想找到一种方法可以让.Net程序在未安装framework的电脑上运行,但一直没有找到真正可用的。虽然有些公司发布了可以将.net代码编译成navtive代码以脱离.net环境运行,如Remotesoft DOTNET Linker,Xenocode Postbuild等,但一直没有破解版,用它们编译的程序每次运行会添出个版权信息。最近偶然发现一种方法可以做到真正使程序脱离.net环境运行且没有任何版权信息添出,现将使用方法、源代码、测试程序发布于此: 请首先在文章末尾下载测试程序,是一个用C#做的串口工具,下载解压后有两个文件夹(FrameWork和APP)和一个程序(串口工具.exe),在APP文件夹下有一个名为9527.exe的程序,这个是C#真正的“串口工具.exe”,而主目录下的串口工具.exe只是一个Loader程序,它运行后首先判断电脑上有没有安装framework,若有,则直接启动APP下的9527.exe程序;若无,则通过framework虚拟机(FrameWork下的VM.exe(其实是飞信框架里的FetionVM.exe,修改了它的图标和版权,想改成其它的大家可以用VC改一下,有网友强列要求指出这一点,想不明白为什么,呵呵,让指出就指出吧,还要求指出调用的方法,,其实我连源程序都公布了,用说的这么明白吗))启动9527.exe程序。Loader程序不会打开任何窗口,并在启动真正应用程序后立即退出。Loader程序主函数(VC6.0编写)的代码如下:  主函数: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { TCHAR fwVersion[VERSION]; if(CheckRegistryKeyExistance(fwVersion)) { if(CompareFWVersions(fwVersion, "2.0"))//最低版本要求2.0 { RunApplication(".\\app\\9527.exe");//直接运行 } else { //应用程序放在APP目录下,要启动的程序的名字为9527.exe, //9527周星弛在《唐伯虎点秋香》的代号,呵 RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } } else { RunApplication(".\\FrameWork\\VM.exe \".\\app\\9527.exe\"");//通过虚拟机运行 } return 0; } 判断是否安装的代码就不贴出来了,可以在文章末尾下载整个VC6的工程文件看。 下面总结一下如何使用: 1. 下载我的例子程序 2. 清空APP下的所有文件 3. 把你自已的.net可执行程序和相关文件全部复制到APP下,并将可执行程序的名字改为9527.exe (不喜欢这个名字可以修改Loader程序重新编译) 4. 把主目录的“串口工具.exe"名字改成任何你想要的名字。(要改图标的话,建议下载我的Loader源程序,修改后重新编译) 大功告成,拿到一台没装.net的电脑上试试吧。祝好运。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值