C#调用DLL问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#调用DLL问题相关的知识,希望对你有一定的参考价值。

无法直接启动带有“类库输出类型”的项目。
若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设为启动项目。

这个是什么意思啊?

你要调试类库的代码,就要加一个应用程序的项目,用这个项目引用你的类库,然后再类库代码里设置好断点,设置应用程序项目为启动项目,然后调试 参考技术A DLL文件是不能调试的,你要建一个exe的项目,引用这个DLL就可以运行了。

从 C# 调用非托管 .dll 的性能

【中文标题】从 C# 调用非托管 .dll 的性能【英文标题】:Performance of Calling Unmanaged .dll from C# 【发布时间】:2010-03-03 22:51:46 【问题描述】:

使用以下语法从 C# 应用程序调用用 C++ 编写的 .dll 会增加多长时间?

[DllImport("abc.dll", EntryPoint = "xcFoo", CallingConvention = CallingConvention.Cdecl)]
public extern static Result Foo(out IntPtr session,
                [MarshalAs(UnmanagedType.FunctionPtr)]ObjectCallback callback, 
                UInt64 turnKey,
                string serverAddress, 
                string userId, 
                string password);

有没有更有效的方法?

【问题讨论】:

【参考方案1】:

查看这篇文章,了解如何提高互操作性能。应该做什么以及最好避免什么。

http://msdn.microsoft.com/en-us/library/ms998551.aspx

【讨论】:

【参考方案2】:

您是在谈论调用本机方法的开销吗?如果是这样,我认为这根本不重要,因为.NET框架类库中有很多这样的调用。

现在,只能通过进行性能测量并将其与您的预期进行比较来回答开销对您的方案是否重要。

【讨论】:

【参考方案3】:

编组到本机方法将花费来自 NT 堆的三个内存分配,这还不错。令人担心的是代表回来。

【讨论】:

【参考方案4】:

检查这类事情的一个好方法是在你进行调用的地方设置一个断点。不知道何时加载库,所以可能只检查第二次调用的断点(除非加载成本是您主要关心的问题)。然后在visual studio中打开反汇编窗口,看看你的dll函数被调用之前有多少行。

【讨论】:

【参考方案5】:

我知道这个问题很老了,但我设法以极快的速度调用本机函数,不仅使用 calli CIL 指令,还使用特殊技巧,但是如果你处理复杂类型,你需要自己处理 pinnig 和/或编组参数包括字符串..

【讨论】:

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

c++调用opencv相关函数并打包成dll,c#不能调用

java调用C#封装的DLL文件

如何从本机 C(++) DLL 调用 .NET (C#) 代码?

从 C# 调用非托管 .dll 的性能

c#编程添加引用dll文件后怎样调用

创建 C++ Dll,并从 C# 调用它