Tag: loadlibrary

FreeLibrary无限期地返回true

有没有理由说FreeLibrary会重复返回true? 我正试图从我的进程中卸载一些本机dll,所以我得到它的句柄,然后调用FreeLibrary直到引用计数变为零,因此FreeLibrary返回false …但它永远不会: IntPtr pDll = DllLoadingImports.LoadLibrary(dllTounLoad); //throw if pDll == IntPtr.Zero while(DllLoadingImports.FreeLibrary(pDll)); 代码运行,永不返回。 进程资源管理器也会显示仍然加载的dll。 更多背景: 我正在尝试卸载使用DllImport加载的本机库,我正在使用这里描述的技巧: https ://stackoverflow.com/a/2445558/2308106这是为了进行原型设计,所以我不必关心可能的结果…但我很困惑为什么图书馆不会卸载 编辑1 :我发现通过在GetModuleHandleEx函数中指定GET_MODULE_HANDLE_EX_FLAG_PIN标志可以实现类似的行为(可以在dll加载时从DllMain中调用)。 我试图卸载的DLL是python.dll(更准确地说是python36.dll)。 但是在python源代码中没有找到这个标志的用法。 DllMain本身是空的。 编辑2 :我被问到最小的可执行示例 – 所以这里它:它使用pythonnet库(版本2.3.0) – 这是PythonEngine调用。 [TestFixture] public class PythonUnloadTest { public static class DllImports { [DllImport(“kernel32.dll”)] public static extern IntPtr LoadLibrary(string dllToLoad); [DllImport(“kernel32.dll”)] public static extern bool FreeLibrary(IntPtr hModule); } […]

从C ++调用C ++ DLL可以正常工作,但不能从C#调用

我有一个名为tccdvc.dll的DLL,它是SDK的一部分: http://www.commell.com.tw/Download/Driver/Industrial%20Peripheral/Driver/MPX-885/MPX-885%20SDK%20(1.2)/SetupCOMMELL%20MPX-885_20100627.rar DLL是用C ++编写的,检查DLL显示它与链接器版本6.0链接,因此我假设它是用VC ++ 6.0编写的。 DLL没有源代码,只有.lib文件和.h文件。 所有导出的函数都声明为extern“C”(因此没有C ++名称修改)和APIENTRY(所以__stdcall)。 我在Windows XP SP3(32位)上的Visual Studio 2010中编写了一个C ++(非.NET)程序来访问此tccdvc.dll。 这在使用提供的.lib文件和使用LoadLibrary / GetProcAddress时都可以正常工作。 我还编写了一个使用tccdvc.dll的C ++ DLL(我们称之为mywrapper.dll),并且在两个版本中,一个使用.lib文件,另一个使用LoadLibrary / GetProcAddress。 再次,这很好。 这个mywrapper.dll使用__cdecl调用约定。 它包含一个名为InitMyWrapperDLL()的函数,它加载tccdvc.dll。 使用LoadLibrary / GetProcAddress的mywrapper.dll版本的代码如下: typedef int (APIENTRY *TCCPROCTYPE01)(); HMODULE TCCmodule; TCCPROCTYPE01 Proc_TCC_DVCOpen; extern “C” __declspec(dllexport) void InitMyWrapperDLL () { TCCmodule = LoadLibrary(“tccdvc.dll”); Proc_TCC_DVCOpen = (TCCPROCTYPE01)GetProcAddress(TCCmodule, “TCC_DVCOpen”); … } 再次,使用C ++前端,这很好。 […]

使用数组的非托管导出

我正在使用RGiesecke DLLExport库生成一个可以从Delphi动态加载的C#DLL。 我有一个方法,如: [DllExport(“GetVals”, CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] static void GetVals([In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] valueList, int len) { valueList = new int[3]; int[] arrList = new int[] { 1, 2, 3 }; int idx = 0; foreach (int s in arrList) { valueList[idx] = s; idx++; } } 我希望能够从这个调用中返回一个数组,问题是我不会事先知道数组的大小,这只会在RunTime中确定。 测试我做了以下(也在C#中) IntPtr hLibrary = […]

DllImport vs LoadLibrary,最好的方法是什么?

我通常在c#.NET中使用Win32 API。 但不要在一个应用程序中声明所有内容。 有时通常使用user32,有时gdi32 ……我想当我声明所有api函数时,那些使用大量内存。 在.NET中使用API​​的最佳方法是什么?

每当我加载它时,C# – cc3260mt.dll都会抛出ArithmeticException

我有一个WPF应用程序,我必须加载DLL cc3260mt.dll我通过使用LoadLibrary()调用它,但无论出于何种原因我得到一个ArithmeticException。 这是我的代码的样子: public partial class MainWindow : Window { [DllImport(“kernel32.dll”)] static extern IntPtr LoadLibrary(string dllToLoad); [DllImport(“kernel32.dll”)] static extern IntPtr FreeLibrary(IntPtr hModule); public MainWindow() { InitializeComponent(); try { string cc3260mtPath = “dll/cc3260mt.dll”; IntPtr cc3260Link = LoadLibrary(cc3260mtPath); } catch (Exception ex) { Console.WriteLine(“ERROR : ” + ex.Message); } } // <– This is where I get […]

DllImport或LoadLibrary以获得最佳性能

我有外部.DLL文件,里面有快速汇编程序代码。 调用此.DLL文件中的函数以获得最佳性能的最佳方法是什么?