C# 来自windows服务的PInvoke
我试图从c#windows服务调用cpp dll函数,但每次调用时,服务都会立即停止,不会显示任何错误或抛出异常,并且事件日志为空。我也尝试过通过另一个程序集(服务之外)调用PInvoke,它可以正常工作。服务正在x86中编译(与程序集相同) 有什么想法吗 下面是我的代码:C# 来自windows服务的PInvoke,c#,c++,pinvoke,C#,C++,Pinvoke,我试图从c#windows服务调用cpp dll函数,但每次调用时,服务都会立即停止,不会显示任何错误或抛出异常,并且事件日志为空。我也尝试过通过另一个程序集(服务之外)调用PInvoke,它可以正常工作。服务正在x86中编译(与程序集相同) 有什么想法吗 下面是我的代码: [DllImport(@"C:\Test.dll", EntryPoint = @"TestFn", SetLastError = true, Call
[DllImport(@"C:\Test.dll",
EntryPoint = @"TestFn",
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
private static extern int TestCppDll();
要调用im,只需调用TestCppDll()代码>
这解决了我的问题:
我将cpp代码中的TestFn从
extern "C" __declspec(dllexport) int
TestFn()
{
return 1;
}
致:
然后我改变了c#调用约定,使用std而不是Cdecl您尝试过单步执行服务吗?我猜DLL加载在服务用户的上下文中失败了。您在哪个用户下运行服务?我希望您没有使用LOCALSYSTEM!顺便说一句,我想您不应该这样做。这只适用于Windows API函数。LOCALSYSTEM是错误的句号。别这样!尝试让服务器以真实用户身份登录,例如您。我并不是说这是一个长期的解决方案,但它可能会把我们引向正确的方向。您还可以向我们展示一下TestCppDll/TestFn的外观吗?嗨,Bryan,TestCppDll函数调用周围是否有一个通用的异常处理程序?我要求这样做的原因是,帐户权限问题应该引发托管异常,但是如果进程在没有引发异常的情况下死亡,那么我会怀疑DLL中未更改的代码中有什么内容,但是,在非服务测试用例中,它应该会失败……我最终解决了问题。我将cpp fn更改为在extern修饰符上使用u stdcall,然后使用std调用约定在c中调用它。我不知道为什么那样做了,但它做到了。。现在一切正常,谢谢大家的帮助!
extern "C" __declspec(dllexport) int __stdcall
TestFn()
{
return 1;
}