我花了几个小时寻找答案,所以我想,如果我问自己,我最终会得到我的问题的解决方案。首先,描述我想要做的事情:

因此,为了描述上面的设计,我有一个用纯c++编写的.dll插件(我不希望它包含任何.Net代码)。此c++插件将在软件平台上使用。现在,我想让windows服务与软件平台进行交互,但它只能通过c++ dll来实现。出于这个原因,我将c++插件的所有功能包装到包装的Dll中(我导出了该功能),并将包装的Dll用于c# windows服务。
现在,我有了一个测试方法来检查c++功能的导出是否工作正常(只是一个返回两个整数之和的简单方法),我可以看到windows服务可以以正确的方式与c++非托管dll交互,我得到了正确的结果。我遇到的问题是,当我试图通过c++非托管动态链接库与软件平台交互时。我得到以下错误:

我意识到这个错误应该是因为软件平台和包装的dll不能同时访问非托管Dll。为了解决这个问题,我发现解决方案是在GAC中添加未被管理的dll。但是,要将动态链接库放入GAC中,该动态链接库必须具有强名称,但我发现除非启用了/clr选项,否则无法为非托管代码签名强名称。但是,当我启用此选项时,非托管dll无法编译。
总而言之,有没有什么方法可以让我的非托管dll被软件平台和包装的dll访问?在我的非托管代码中没有集成.Net?
我已经花了很多时间寻找解决方案,所以如果你们中的任何人能给我一点启发,那就太好了!
谢谢
发布于 2014-11-25 17:25:52
您的非托管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架构。此外,确保您使用的是正确的CallingConvention。一个很好的例子是:Unhandled Exception: System.AccessViolationException: Attempted to read or write
https://stackoverflow.com/questions/27122662
复制相似问题