Tag: dllimport

将c ++ dll导入windows phone项目

我是Windows手机开发的新手,我有一个问题,我不知道如何解决…. 问题是…. 我有一个c ++项目,我已经完成了Visual c + + 2010,并创建了一个代码编译的DLL … 所以我知道C#import dll库但是当我添加引用时它会使这个错误“无法检索程序集fullname”“参数名称:AssemblyPath”而我不知道这意味着什么… 我搜索谷歌,我发现一种方法导入c ++ DLL手动与DllImport和调用外部方法…导致一个错误,因为它没有找到DLL位置…它发生的原因是因为wp7不支持C ++ ??? 谢谢你的帮助

如何处理失败的DllImport?

我正在尝试编写一个C#托管类来包装SHGetKnownFolderPath,到目前为止它可以在Vista上运行,但由于没有像预期的那样在shell32.dll中找到正确的函数而在XP上崩溃。 我想让它设置好所以如果使用XP,我可以使用System.Environment.GetFolderPath来回避(通常是hacky)解决方案。 (或者,更好的是,如果它在shell32中找不到function。) 除了条件编译之外,还有什么方法可以做到吗? 我目前的代码如下: public abstract class KnownFolders { [DllImport(“shell32.dll”)] private static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath); // Trim properties to get various Guids. public static string GetKnownFolderPath(Guid guid) { IntPtr pPath; int result = SHGetKnownFolderPath(guid, 0, IntPtr.Zero, out pPath); if (result == 0) { string s […]

DllImport和char *

我有一个我想从DLL导入的方法,它有一个签名: BOOL GetDriveLetter(OUT char* DriveLetter) 我试过了 [DllImport(“mydll.dll”)] public static extern bool GetDriveLetter(byte[] DriveLetter); 和 [DllImport(“mydll.dll”)] public static extern bool GetDriveLetter(StringBuilder DriveLetter); 但是没有在DriveLetter变量中返回任何内容。

在C#项目中使用C ++ DLL

我有一个C ++ DLL,它必须集成在一个C#项目中。 我想我找到了正确的方法,但是调用dll会给我这个错误:System.BadImageFormatException:试图加载一个格式不正确的程序。 (HRESULTexception:0x8007000B) 这是dll中的函数: extern long FAR PASCAL convert (LPSTR filename); 这是我在C#中使用的代码 namespace Test{ public partial class Form1 : Form { [DllImport(“convert.dll”, SetLastError = true)] static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename); private void button1_Click(object sender, EventArgs e) { // generate textfile string filename = “testfile.txt”; StreamWriter sw = new StreamWriter(filename); sw.WriteLine(“line1”); sw.WriteLine(“line2”); sw.Close(); […]

urlmon.dll FindMimeFromData()在64位桌面/控制台上运行良好,但在ASP.NET上生成错误

我正在创建一个实用程序库,以便在Web环境中的桌面环境中使用。 它包含我认为在我的应用程序中经常重复的几个function,包括通过其内容(而不是扩展名)获取文件的mime类型的实用程序。 我必须检查的文件是最常见的(jpg,png,pdf,txt)所以我选择使用外部方法FindMimeFromData (上面的链接) 使用.NET,如何根据文件签名而不是扩展名找到文件的mime类型 该方法效果很好,除了两个不正确的mime类型的JPG( image/pjpg )和PNG( image/x-png )之外,通过在return语句之前进行检查很容易解决。 该库是为平台AnyCPU编译的,因为它必须以32位和64位安装在服务器/客户端上。 在桌面环境测试时,所有为x86和x64编译的应用程序都正常工作。 在测试ASP.NET应用程序(带有用于测试的http处理程序的空站点)时发生HRESULT类型的错误,调试器告诉我它无法提供进一步的信息。 经过一些测试配置,包括将池的身份更改为本地系统(没有结果),我已经确定了问题: 池应该允许32位应用程序(见上图)。 为什么? 它不应该加载我们现在的64位系统的dll urlmon.dll ? 这是一个很大的问题,因为FindMimeFromData方法可以被任何地方调用到这个库中: 结果是,另一个实用程序方法调用此方法可能会抛出此exception,并且通过调试也很难跟踪问题。 任何想法/经验? 用于测试的操作系统 桌面: Windows 8 x64 – 有效 Windows 7 x64 – 有效 Windows Server 2008 Standard R2 x64 – 有效 Windows Server 2008 Standard x86 – 有效 Windows Server 2003 Standard x86 – […]

DllImport生成System.DllNotFoundException

我在尝试从我的应用程序中使用非托管代码dll时遇到了一些困难(用C#framework 4.0编写)。 我正在使用dll导入如下 [DllImport(@”C:\MGW_SDK.dll”, EntryPoint = “fInicializaSDK”)] public static extern int fInicializaSDK(); 奇怪的是,从我的开发环境(Windows XP)调用时,它工作得很好,但是当在生产服务器(Windows7)上时,它会生成以下exception: System.DllNotFoundException :无法加载’ C:\MGW_SDK.dll’ :找不到指定的模块。 (来自HRESULT的exception:0x8007007E) Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK()位于C:\Work\AgroIn\AdminPaqRepository.cs中的Comtpaq.AdminPack.AdminPaqRepository.InitializeSDK() :第30行 我已经运行了Dependency Walker ,它显示以下依赖项是冲突的: C:\windows\system32\SHLWAPI.DLL 我已经尝试将该dll复制到我的部署目录 MGW_SDK.dll在c:\ (如路径所示) 我已经安装了C运行时库 我还注意到一些有趣的东西:在例外情况下,开发路径显示C:\Work\AgroIn\AdminPaqRepository.cs:line 30 还有什么可能是这里的问题? 编辑 我用MGW_SDK.dll一个extern / dllimport方法构建了一个小型控制台应用程序并且运行它没有任何问题(没有任何DllNotFoundException ),所以这似乎与我正在构建的应用程序有关(a WCF服务)。 此服务托管在WAS上,但我仍然无法找到问题。

加载64位dll时,带有HRESULT 0x8007007E的DllNotFoundException

我下载了zlib并将该库编译为Windows 32位和Windows 64位dll。 我现在有zlibwapi.dll和zlibwapi64.dll 。 dll被复制到我的应用程序文件夹中,引用如下: [DllImport(@”zlibwapi.dll”, EntryPoint = “uncompress”, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)] private static extern int uncompress32( IntPtr dest, ref uint destLen, [In(), MarshalAs(UnmanagedType.LPArray)] byte[] source, uint sourceLen ); [DllImport(@”zlibwapi64.dll”, EntryPoint = “uncompress”, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = false)] […]

DllImport或LoadLibrary以获得最佳性能

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

如何使用C#获取char **?

我需要以下列forms将参数传递给不安全的DllImported函数: [DllImport(“third_party.dll”)] private static extern unsafe int start(int argc, char** argv); 我假设它是一个字符串数组。 但是,当我尝试执行以下操作时,我得到’无法从字符串[]转换为char **’错误。 我如何让这个工作? 谢谢。 string[] argv = new string[] { }; start(0, argv); 编辑1:问题被标记为重复,但看着可能重复的问题,我仍然没有看到如何使这个工作。 编辑2:进一步确定问题和所需参数。 它看起来像您的标准argc / argv参数(参数计数,然后是参数值)。 与启动ac程序的方式相同: int main(int argc, char** argv); 对于这个特殊问题,我根本不想传递任何参数(因此count为0)。 编辑3:我从第三方库供应商那里获得了更多信息。 这里是: 第一个参数是参数计数 第二个参数是一个以空字符结尾的字符串数组 字符串是ANSI编码的 编辑4 :使用工作解决方案进行最终编辑(至少在我的情况下)。 我会把它作为答案,但不能,因为这个问题被标记为重复。 这是一个帮助我最多的问题的链接 。 最后,dll函数需要一个指向ANSI字符串缓冲区的指针数组。 所以我的最终方法(基于相关问题)如下。 在内存中创建一个数组来保存指针,然后将每个字符串分配到内存中的其他位置,并在第一个指针数组中写入指向这些字符串的指针。 此代码适用于生产: [DllImport(“third_party.dll”, CallingConvention = CallingConvention.Cdecl, […]

为什么使用DllImport属性作为添加引用?

我见过几个这样的例子: [DllImport(“user32.dll”)] static extern bool TranslateMessage([In] ref Message lpMsg); [DllImport(“user32.dll”)] static extern IntPtr DispatchMessage([In] ref Message lpmsg); 但是,我不明白的是为什么有人会这样做,因为只是引用DLL就像他们做其他库一样? MSDN声明:“在托管应用程序中重用现有的非托管代码时,DllImport属性非常有用。例如,托管应用程序可能需要调用非托管WIN32 API。” 但是,是不是说引用一个非托管的dll是不行的,否则不可能?