我有一个Visual Studio项目,它有一个VC ++ .dll项目,以及一个C#控制台应用程序和一个C#服务,它们都使用这个引用VC ++ .dll:
[DllImport("ImagingService.dll")]
public static extern int main();
在控制台应用程序的Main()
方法中,我调用.dll的main()
方法,一切都按预期工作。
在C#服务项目中,我从main()
方法中调用OnStart()
方法。如果我所拥有的代码是VC ++应用程序中的return 0
,它会按预期返回0。但是,如果我直接从this GitHub复制代码,我会收到如下错误:
System.DllNotFoundException:无法加载DLL“ImagingService.dll”:找不到指定的模块。 (来自HRESULT的异常:0x8007007E)
控制台应用程序正在使用预期的环境变量来查找链接并包含在VC ++应用程序中的GStreamer
依赖项,但似乎Windows服务无法找到它们。我知道它找到了ImagingService.dll
,因为如果我注释掉GStreamer
代码它会起作用。
我是否正确地假设,因为它在控制台应用程序中工作,我的所有包含在C ++应用程序中都是正确的?关于服务如何调用失败的GStreamer
dll,还有一些不同之处。
更新:由于对如何设置我的服务存在疑问,我创建了一个简单的解决方案,其中包括基本的C ++ DLL和C#服务以及C#控制台应用程序。控制台工作正常,服务没有。如果有人有兴趣查看它,我已经包含了一个下载链接。
您还需要安装主x64 GStreamer安装程序和此处的x64 Devel软件包:Gstreamer Download
*注意* - 安装主gstreamer-1.0安装程序时,请确保选择安装“在某些国家/地区存在潜在专利问题的受限编解码器”选项。您还需要安装devel包。
对于测试,您可以通过在Media> OpenNetwork Stream文本框中键入以下内容来使用VLC。
RTSP://127.0.0.1:8554 /测试
否则,使用GStreamer安装程序,他们打包运行此命令进行测试:
gst-launch-1.0 rtspsrc location = rtsp://127.0.0.1:8554 / test! rtph264depay! avdec_h264! autovideosink
如果您将C#应用程序设置为“任何CPU”,那么这很可能是您的问题。如果您的C#应用程序启动是x64应用程序,那么ImagingService.dll必须是x64 dll,如果您的应用程序作为x86应用程序启动,则ImagingService.dll必须是x86 dll。
我会将C#应用程序限制为一种架构类型。您可以在“平台目标”属性的C#项目属性构建选项卡中更改此设置,并且(我会假设)将其设置为x86类型。
如果体系结构正确,则无法加载ImagingService.dll,因为它无法加载/查找dll和/或它可以加载/查找ImagingService.dll所依赖的任何依赖dll。这可能是路径问题或DLL加载路径问题。
更新:在您的情况下,问题是您的DLL静态和动态加载来自“gstreamer”安装的DLL。因此必须能够加载所有这些DLL。
我假设控制台版本有效,因为gstreamer安装路径在USER路径设置中,而服务没有,因为它不是因为你没有得到你做的例外。
所以有3种可能的方法来解决这些基本上都是一个解决方案:将gstreamer dll添加到DLL加载路径。
1和2简单,不需要任何代码更改。 3.要求更改代码。
对于C ++ DLL,您可以执行以下操作: