Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自windows服务的PInvoke_C#_C++_Pinvoke - Fatal编程技术网

C# 来自windows服务的PInvoke

C# 来自windows服务的PInvoke,c#,c++,pinvoke,C#,C++,Pinvoke,我试图从c#windows服务调用cpp dll函数,但每次调用时,服务都会立即停止,不会显示任何错误或抛出异常,并且事件日志为空。我也尝试过通过另一个程序集(服务之外)调用PInvoke,它可以正常工作。服务正在x86中编译(与程序集相同) 有什么想法吗 下面是我的代码: [DllImport(@"C:\Test.dll", EntryPoint = @"TestFn", SetLastError = true, Call

我试图从c#windows服务调用cpp dll函数,但每次调用时,服务都会立即停止,不会显示任何错误或抛出异常,并且事件日志为空。我也尝试过通过另一个程序集(服务之外)调用PInvoke,它可以正常工作。服务正在x86中编译(与程序集相同)

有什么想法吗

下面是我的代码:

[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;
}