在 C# 上使用非 clr dll

Posted

技术标签:

【中文标题】在 C# 上使用非 clr dll【英文标题】:using non-clr dll on C# 【发布时间】:2014-03-04 00:27:59 【问题描述】:

我正在使用许可库(c++ dll)来开发 c# 应用程序。

我没有那个库的任何代码,那不是 clr。

但我可以使用 pInvoke 将其方法导入 c#,如下所示。

[DllImport("FaceFinding.dll", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
unsafe internal static extern int EnrollmentGalleryDBOneToOne(StringBuilder currentFolderPath);

它在调试模式下完美运行。

但这里有问题。

当我制作 Visual Studio 安装程序项目时,我无法在安装程序上导入该 dll 文件,因为那不是 clr。

有没有办法在 c# 安装程序项目中导入非 clr dll?

【问题讨论】:

您是否将其包含在您的安装程序中? @DanielA.White 我可以包含它,但只是归档。不是组装。它不适用于已安装的程序。 如果您需要 DllImport DLL,它是一个 非托管 DLL,因此它永远不会是 .NET 意义上的“程序集”。如果您的程序由于其他原因无法运行,请在安装后尝试调试它 只是一个需要复制的文件,仅此而已。请务必使用所有者的安装说明,可能需要存在其他依赖项,例如 C/C++ 运行时支持 DLL。如果您不确定,请联系他寻求支持,您需要为此付费。坚持使用 MSI 合并模块,这是一个非常合理的要求。 【参考方案1】:

将所有非托管 DLL(包括 FaceFinding.dll)放入安装程序项目的文件系统编辑器的输出文件夹中。这样,它们将与您的应用程序一起发布。

作为旁注,我还建议确保此第 3 方 DLL 的许可允许您通过检查其许可协议将其与您的应用程序一起分发。

【讨论】:

感谢您的回答。当我将所有 DLL 放在输出文件夹中时,CLR DLL 添加为程序集,但非 clr DLL 添加为文件。所以安装后就不行了。 请澄清添加为程序集或添加为文件是什么意思?您只需要将文件放在已知位置即可使用 pInvoke。通过将它放在输出文件夹中,它就在您的可执行文件旁边,这使您当前的代码可以按原样工作

以上是关于在 C# 上使用非 clr dll的主要内容,如果未能解决你的问题,请参考以下文章

C#基础之CLR的执行模型

在 C++ /CLR 项目中使用 C++ DLL 库项目

运行使用 /clr 构建的 DLL 的本机 C++ 应用程序时访问冲突

使用包含托管类的 /CLR 标志构建的本机 dll

sql server 调用c dll

从 C++ 调用 C# dll