DllImport Unmanaged, Non .NET Dll to .NET Project 表示 Char * 和 Void __StdCall

Posted

技术标签:

【中文标题】DllImport Unmanaged, Non .NET Dll to .NET Project 表示 Char * 和 Void __StdCall【英文标题】:DllImport Unmanaged, Non .NET Dll to .NET Project Representing Char * and Void __StdCall 【发布时间】:2010-02-26 16:54:44 【问题描述】:

我有一个用 Borland C++ 编写的非 .net 和非托管 DLL,我需要导入它。它返回 void 并在函数上具有标识符 __stdcall。它还需要传递 char *。当我尝试在 VS 2005 中将其添加为对我的项目的引用时,它返回无效程序集的错误。

如何在 C# 中做到这一点?

这是我目前拥有的,但它不起作用:

[DllImport ("Project1.dll", CallingConvention=CallingConvention.StdCall)]
    public static extern IntPtr CustomerForm
        (String caption);

【问题讨论】:

看看***.com/questions/528517/… “它不起作用”不能帮助我们帮助您。您肯定会收到比“它不起作用”更好的异常消息吗? @nobugz: tommieb 似乎能够很好地解决这个问题.. 感谢您的参与 【参考方案1】:

对于非托管 DLL,您不要将其添加为引用。确保二进制 DLL 与 .NET EXE 项目通常位于 project\bin\debug 的构建位于同一文件夹中。

另外,当您使用 Borland C++ 构建非托管 DLL 时,请确保您有一个用于导出的 .DEF 文件。

编辑:

图书馆项目1 出口 客户表格

并且在你的 Borland C++ 源代码中确保函数被声明为导出,例如:

#ifdef __cplusplus __declspec(dllexport) void CustomerForm(char *s); #万一

使用这个可以保证函数是可导出的,可以链接的!

确保您的 DllImport 属性的签名与您的原生 C++ Dll 的签名相匹配,即

[DllImport ("Project1.dll", CallingConvention=CallingConvention.StdCall)] 公共静态外部无效客户表单(字符串标题);

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

必须在 bin\debug 目录下吗?它是一个非托管的 DLL,所以在正常的 PATH 搜索中的任何地方都应该可以工作,对吧? 另外,如果它是一个 char*,则需要确保将 CharSet = CharSet.Ansi 添加到 DllImport 属性中,以确保将字符串编组为多字节字符字符串 @Nick:为了不让 Windows 文件夹与开发人员构建的 DLL 混淆,最好将该 DLL 部署在 .NET exe 程序所在的同一目录中。项目目录对应于 Visual Studio 中解决方案窗口中的项目。例如,一个名为 SolnFoo 的解决方案有一个名为 Foo 的项目,那么将有一个 Foo\bin\debug 文件夹,其中构建了 .NET exe。 我同意这将是 preferable...但它不是 必需,这是您的答案所暗示的。 @Nick:很公平,当然可以,如果它位于 PATH 中,那没问题... :)【参考方案2】:

要使用 DllImport,您不需要添加 dll 的引用,只需将 dll 放在可执行文件旁边或 system32 中即可。

【讨论】:

以上是关于DllImport Unmanaged, Non .NET Dll to .NET Project 表示 Char * 和 Void __StdCall的主要内容,如果未能解决你的问题,请参考以下文章

非对象字段错误对齐或重叠

无法为 Unmanaged<AnyObject> 调用初始化程序?迅速没有争论

如何从 CGColorSpace 获得 Unmanaged<CGColorSpace>?

如何将 C/C++ dll 导入 .NET 应用程序

使用 Hibernate Unmanaged JPA 在 Equinox OSGI 框架中获取 EntityManagerFactory

Google Play开发者控制台中未提供UnManaged选项