我有一个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
答案 0 :(得分:0)
如果您将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。
我假设控制台版本有效,因为gstreamer安装路径在USER路径设置中,而服务没有,因为它不是因为你没有得到你做的例外。
所以有3种可能的方法来解决这些基本上都是一个解决方案:将gstreamer dll添加到DLL加载路径。
1& 2简单,不需要任何代码更改。 3.要求更改代码。
对于C ++ DLL的3,您可以执行以下操作:
设置延迟加载dll静态要求的所有gstream dll(项目属性/链接器/输入/延迟加载的Dll)
将gstreamer路径添加到dll加载路径(这可能来自您的应用配置或C#组件)。
因此,在调用任何gstreamer API之前,您需要添加以下内容:
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); AddDllDirectory(L" C:\的GStreamer \ 1.0 \ x86_64的\ BIN&#34);