在为.NET提供一个体面的embedded式框架(CEF)的领域,两个领先的select似乎是CefSharp和CefGlue。 它们在方法上有所不同(CefGlue使用P / Invoke调用CEF非托pipe代码,CefSharp使用CEF库的混合模式C ++ / CLI包装器)。 混合模式程序集比P / Invoke调用更好吗? 所有其他的事情都是平等的,看起来CefGlue(P / Invoke库)为CEF项目提供了一个“更薄”的包装,这意味着它可能更快地响应上游库中的更新。 这两个图书馆的经验是否可以分享哪些差异化因素?
切换到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 […]
我正在研究一个应用程序,它遍历某些目录中的每个文件,并对这些文件执行一些操作。 其中,我必须检索文件的大小和文件修改的date。 某些文件全名(目录+文件名)太长,我无法使用.NET Framework FileInfo ,它仅限于MAX_PATH (260个字符)。 许多Web源build议通过P / Invoke使用本机Win32函数来访问名称太长的文件。 目前,Win32函数似乎也出现了完全相同的问题。 例如, GetFileAttributesEx (kernel32.dll)失败,Win32错误3 ERROR_PATH_NOT_FOUND为270个字节的path。 同样的文件可以成功地从记事本2打开,并成功地显示在Windows资源pipe理器(但Visual Studio 2010例如由于259个字符的限制¹没有打开它)。 如果文件path长度为270个字符,我能做些什么来访问文件? 笔记: 删除或忽略文件path长度超过259个字符的文件不是解决scheme。 我只在寻找兼容Unicode的解决scheme。 该应用程序将在安装了.NET Framework 4的Windows 2008 / Vista或更高版本下运行。 ¹令人惊讶的是,Microsoft Word 2007失败了,抱怨说没有任何软盘的计算机上的“软盘太小”,或者剩下4GB的RAM时,“RAM内存不足” “杀毒软件需要更新”。 他们是否会停留一天,至less在诸如Microsoft Office这样的关键产品中显示这样愚蠢的毫无意义的错误?
我试图写一些C#代码调用一个非托pipeDLL的方法。 在dll函数的原型是: extern "C" __declspec(dllexport) char *foo(void); 在C#中,我第一次使用: [DllImport(_dllLocation)] public static extern string foo(); 它似乎在表面上工作,但在运行时收到内存损坏错误。 我想我指的是正确的记忆,但已经被释放了。 我尝试使用一个名为“P / Invoke Interop Assistant”的PInvoke代码gen实用程序。 它给了我输出: [System.Runtime.InteropServices.DLLImportAttribute(_dllLocation, EntryPoint = "foo")] public static extern System.IntPtr foo(); 它是否正确? 如果是这样,我该如何将此IntPtr转换为C#中的string?
我在一段时间以来一直在使用这个奇怪的错误。 这可能是Visual Studio 2010中的新事物,但我不确定。 我试图调用从C#编写的C ++的unamanged函数。 从我在互联网上读到的错误信息本身来看,我的C#文件中的签名与C ++中的签名是不一样的,但实际上我看不到它。 首先这是我下面的无法理解的function: TEngine GCreateEngine(int width,int height,int depth,int deviceType); 这里是我在C#中的函数: [DllImport("Engine.dll", EntryPoint = "GCreateEngine", CallingConvention = CallingConvention.StdCall)] public static extern IntPtr CreateEngine(int width,int height,int depth,int device); 当我debugging到C ++,我看到所有的参数就好了,所以我只能认为它是从TEngine(这是一个名为CEngine类的指针)转换为IntPtr。 我以前在VS2008中使用过,没有任何问题。
这是情况,我在我的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 之前设置它?
这是一个特别在ARM上发生的问题,而不是在x86或x64上。 我有一个用户报告的这个问题,并能够通过Windows IoT在Raspberry Pi 2上使用UWP进行重现。 我以前遇到过这种types的调用约定不匹配的问题,但是我在P / Invoke声明中指定了Cdecl,并试图在本地显式地添加__cdecl,并得到了相同的结果。 这里是一些信息: P /调用声明( 参考 ): [DllImport(Constants.DllName, CallingConvention = CallingConvention.Cdecl)] public static extern FLSliceResult FLEncoder_Finish(FLEncoder* encoder, FLError* outError); C#结构( 参考 ): internal unsafe partial struct FLSliceResult { public void* buf; private UIntPtr _size; public ulong size { get { return _size.ToUInt64(); } set { _size = (UIntPtr)value; } […]
我刚刚从vs2008切换到vs2010。 完全相同的解决scheme,除了现在每一个C ++ DLL调用产生一个'pinvokestackimbalance'exception。 这个exception在2008年没有被解雇。我可以完全访问C ++ dll和调用应用程序。 似乎没有任何问题,但这个问题正在debugging其他问题不可能; IDE不断停下来告诉我这些事情。 例如,这里是C#签名: [DllImport("ImageOperations.dll")] static extern void FasterFunction( [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, int inTotalSize, int inWindow, int inLevel); 以下是C ++端的样子: #ifdef OPERATIONS_EXPORTS #define OPERATIONS_API __declspec(dllexport) #else #define OPERATIONS_API __declspec(dllimport) #endif extern "C" { OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray, unsigned char* outRemappedImage, int inTotalSize, […]
我正在处理MSIL分析器,并遇到ICorProfilerCallback接口的ManagedToUnmanagedTransition和UnmanagedToManagedTransitioncallback问题。 我想要检索的是关于正在调用的方法的信息(它驻留的名称和模块名称)。 到目前为止,它工作正常。 直到所谓的dynamic拼写发生(详细描述在: http : //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_ .aspx ) 在这种情况下IMetaDataImport::GetPinvokeMap失败。 另外IMetaDataAssemblyImport::GetAssemblyProps返回“dynamic_pinvoke”作为程序集的名称。 profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataImport, (IUnknown**) &imd_import, &md_token); imd_import->GetPinvokeMap(md_token, &mapping, module_name, buffer_size, &chars_read, &md_module_ref); // here the fail occurs profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataAssemblyImport, (IUnknown**) &imd_assembly_import, &md_token); imd_assembly_import->GetAssemblyFromScope(&md_assembly); imd_assembly_import->GetAssemblyProps(md_assembly, 0, 0, 0, assembly_name, buffer_size, &chars_read, 0, 0); // assembly_name is set to "dynamic_pinvoke" 如何获取模块名称(.dll)和通过dynamicpinvoke被pinvoked的函数名称?
WPF没有提供允许resize的窗口,但没有最大化或最小化button。 我想能够做出这样一个窗口,所以我可以resize的对话框。 我知道解决scheme将意味着使用pinvoke,但我不知道该怎么调用以及如何。 pinvoke.net的search没有出现在我身上,因为我需要的东西,主要是我确定,因为Windows窗体确实在其窗口上提供了CanMinimize和CanMaximize属性。 有人可以指点我或提供代码(C#首选)如何做到这一点?