繁体   English   中英

从两个不同的应用程序(ac#Windows服务和一个软件平台)访问c ++中的非托管dll

[英]access unmanaged dll in c++ from two different applications (a c# windows service and a software platform)

我已经花了几个小时寻找答案,所以我发现,如果我问自己,我最终可以解决我的问题。 首先,描述一下我想做什么: 打包的DLL和软件平台需要共享未经管理的代码 因此,为了描述上述设计,我有一个用纯c ++编写的.dll插件(我不希望它包含任何.Net代码)。 该c ++插件将在软件平台上使用。 现在,我希望c#Windows服务能够与软件平台进行交互,但是它只能通过c ++ dll来完成。 因此,我将c ++插件的所有功能包装到Wrapped Dll中(导出了功能),并且将Wrapped Dll使用到了c#windows服务中。

现在,我有一个测试方法来检查c ++功能的导出是否正常(只是返回两个整数之和的简单方法),并且我可以看到Windows服务可以与c ++中非托管dll相互干扰。正确的方法,我得到正确的结果。 我遇到的问题是,当我尝试通过c ++非托管dll与软件平台进行交互时。 我收到以下错误:

错误的内存损坏

我意识到该错误应该是由于非托管dll无法同时由Software Platform和Wrapped Dll访问。 为了解决这个问题,我发现解决方案是在GAC中添加非托管dll。 但是要将dll放入GAC中,该dll必须具有一个强名称,但是我发现除非启用了/ clr选项,否则我无法对非托管代码签名一个强名称。 但是,当我启用此选项时,非托管dll无法编译。

总而言之,有什么方法可以让我的非托管dll被软件平台和包装的dll访问? 没有在我的非托管代码中集成.Net?

我已经花了很多时间来寻找解决方案,所以如果你们中的任何一个能给我一些启示的话,那就太好了!

谢谢

您的非托管dll及其所有依赖项必须与应用程序(.exe)位于同一文件夹中。 您不需要GAC。 如果要将dll存储在其他位置,请使用:

p(调用:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool AddDllDirectory(string lpPathName);

在应用程序启动时:

if (System.Environment.OSVersion.Version.Major > 5)
{
    AddDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}
else
{
    SetDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}

另外,请确保不要混淆x86和x64 architexture。 此外,请确保您使用的是正确的CallingConvention。 一个很好的例子是: 未处理的异常:System.AccessViolationException:尝试读取或写入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM