我在VS 2008中有一个解决scheme,其中有两个项目。 一个是用C ++编写的DLL,另一个是从一个空白项目创build的一个简单的C ++控制台应用程序。 我想知道如何从应用程序中调用DLL中的函数。 假设我从一个空白的C ++项目开始,我想调用一个名为int IsolatedFunction(int someParam) 我怎样称呼它?
切换到VS2010后,托pipe的debugging助手显示一个关于从C#应用程序调用非托pipeC ++函数的不平衡堆栈的错误。 通常的嫌疑人似乎不会造成这个问题。 还有什么我应该检查? VS2008内置的C ++ DLL和C#应用程序从来没有问题,没有奇怪的或神秘的错误 – 是的,我知道这并不意味着太多。 这是检查的事情: 该dll名称是正确的。 入口点名称是正确的,并已通过depends.exe进行validation – 代码必须使用损坏的名称,它的确如此。 调用约定是正确的。 大小和types似乎都是正确的。 字符集是正确的。 在忽略错误之后似乎没有任何问题,并且在debugging器外部运行时没有问题。 C#: [DllImport("Correct.dll", EntryPoint = "SuperSpecialOpenFileFunc", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true)] public static extern short SuperSpecialOpenFileFunc(ref SuperSpecialStruct stuff); [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] public struct SuperSpecialStruct { public int field1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst […]
这是情况,我在我的dot.net应用程序中使用基于C的dll。 有2个DLL,一个是32位的叫MyDll32.dll,另一个是64位的叫MyDll64.dll的版本。 有一个静态variables包含DLL文件名:stringDLL_FILE_NAME。 并以如下方式使用: [DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")] private static extern int is_Func1(int var1, int var2); 迄今为止简单。 你可以想象,这个软件是在“Any CPU”打开的情况下编译的。 我也有以下代码来确定系统是否应该使用64位文件或32位文件。 #if WIN64 public const string DLL_FILE_NAME = "MyDll64.dll"; #else public const string DLL_FILE_NAME = "MyDll32.dll"; #endif 现在你应该看到这个问题了.DLL_FILE_NAME是在编译时定义的,而不是在执行时间,所以根据执行上下文没有加载正确的dll。 什么才是解决这个问题的正确方法? 我不想要两个执行文件(一个用于32位,另一个用于64位)? 如何在DllImport语句中使用DLL_FILE_NAME 之前设置它?
.Net库中的许多方法都以本地代码实现。 那些来自框架本身的标记为[MethodImpl(MethodImplOptions.InternalCall)] 。 那些来自一些非托pipeDLL的标记是[DllImport] (例如[DllImport("kernel32.dll")] )。 迄今没有什么不寻常的 但是在为另一个问题写回答时 ,我发现有很多方法用[DllImport("QCall")]标记。 它们似乎是.Net的内部实现(例如GC._Collect() )。 我的问题是: [DllImport("QCall")]是什么意思? [DllImport("QCall")]和[MethodImpl(MethodImplOptions.InternalCall)]之间的区别是什么?
是否有任何免费的本机Windows DLL导出function查看器,其中显示函数名称,以及它们的参数列表?
可能重复: 预处理器指令C# 我有一个外部的c + + dll导入使用DLLImport。 如果我的应用程序正在x64编译我需要导入此dll的x64版本,如果它是x86版本,我需要x86 dll。 达到这个目标的最好方法是什么? 理想情况下,我想要一些预处理指令,但我知道这不适用于C#? 更多信息:该DLL正在被设置为AnyCPU的项目导入。 父项目是确定应用程序编译为x64还是x86的项目。 我们为不同的客户编译两个版本 – 我想在两个版本中共享子项目。
有没有一种方法来指定searchpath与DllImport导入给定的程序集? [DllImport("MyDll.dll")] static extern void Func(); 这将在应用程序目录和PATH环境variables中searchdll。 但有时这个DLL将被放置在其他地方。 可以在app.config或manifest文件中指定这些信息,以避免dynamic加载和dynamic调用?
我有一个托pipe的C#DLL,它使用了一个使用DLLImport的非托pipeC ++ DLL。 一切都很好。 不过,我想embedded我托pipe的DLL内的非托pipeDLL作为微软解释说: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx 所以我将非托pipedll文件添加到我的托pipedll项目中,将该属性设置为“Embedded Resource”并将DLLImport修改为如下所示: [DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", CallingConvention = CallingConvention.Winapi)] 其中“包装引擎”是我的托pipeDLL的程序集名称“非托pipe的Driver.dll”是非托pipe的DLL 当我跑步时,我得到: 访问被拒绝。 (从HRESULTexception:0x80070005(E_ACCESSDENIED)) 我从MSDN和http://blogs.msdn.com/suzcook/看到这应该是可能的…
实际上,我得到了一个C ++(工作)DLL,我想将其导入到我的C#项目中来调用它的函数。 当我指定DLL的完整path时,它确实有效,如下所示: string str = "C:\\Users\\userName\\AppData\\Local\\myLibFolder\\myDLL.dll"; [DllImport(str, CallingConvention = CallingConvention.Cdecl)] public static extern int DLLFunction(int Number1, int Number2); 问题是这将是一个可安装的项目,所以用户的文件夹将不会是相同的(例如:皮埃尔,保罗,杰克,妈妈,爸爸,…)取决于计算机/会话将在哪里运行。 所以我希望我的代码更通用一些,如下所示: /* goes right to the temp folder of the user "C:\\Users\\userName\\AppData\\Local\\temp" then go to parent folder "C:\\Users\\userName\\AppData\\Local" and finally go to the DLL's folder "C:\\Users\\userName\\AppData\\Local\\temp\\myLibFolder" */ string str = Path.GetTempPath() + "..\\myLibFolder\\myDLL.dll"; [DllImport(str, CallingConvention […]