问题标签 [dllimport]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Web 服务在 asp.net 中有效,但在 IIS 中无效
我已经构建了一个使用 DLLImport 访问非托管代码的 Web 服务。该服务在 ASP.NET 服务器中运行得很好,但是一旦我从 IIS 运行该应用程序就会产生错误。我已经检查了权限,将 DLL 移到了 system32 文件夹等......我不知道还能做什么。该服务需要在 IIS 中运行。我应该怎么办?
c# - 涉及指针时如何 P/Invoke
在尝试学习在 C# 中使用 PInvoke 时,我有点不确定如何使用涉及简单值类型的指针来处理各种情况。
我正在从非托管 DLL 导入以下两个函数:
第一个函数使用指针作为输入,第二个函数作为输出。它们在 C++ 中的用法相当简单:
我在 C# 中的第一次尝试导致以下 P/Invokes:
如何像上面的 C++ 代码一样在 C# 中使用这些函数?有没有更好的方法来声明这些类型,也许使用MarshalAs
?
c# - C# 新手:如何修复此代码以进行 DNS 查找?
这是我第一次使用 C#,所以我非常不喜欢我的元素。但我相信 Stack Overflow 的优秀员工可以帮助我!我根据我在互联网上发现的其他一些代码提出了以下代码(如下)。我要做的是查找给定域的所有“文本”DNS 记录 (TXT)。我一开始很简单,使用 Visual C# 2008 Express 中的控制台应用程序查找 google.com 的记录。我会担心稍后根据命令行参数自定义域;现在我只想让这个工作。任何 DNS 查找工具都可以告诉您 google.com 在其 DNS 中有此 DNS 文本记录:
v=spf1 include:_netblocks.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all
但不幸的是,这不是我得到的。这是我的代码:
当我运行此代码时,它会打印Value: ?
. 现在我希望这意味着它实际上做了 DNS 查询并得到了预期的结果,但我只是在它试图将 IntPtr 转换为字符串数组的部分搞砸了(因为我猜它更难调试前者)。无论如何,有什么建议吗?谁能看到我哪里出错了?提前致谢。
c++ - Dllimport 无法导入旧的 Borland dll
我有很多遗留代码,我目前使用旧版 Borland C++ 3.0 进行编译。
这段代码中有一个规则引擎,我想在 C# .NET 应用程序中提取和使用它。
问题是,如果我将规则引擎提取到它自己的 DLL 中,我希望能够从我没有时间移植的现有遗留代码和 C# .NET 应用程序中调用这个 DLL。
如果我使用旧的 Borland 编译器构建 DLL,我不知道如何从 C# .Net 项目中引用它。DllImport 失败并出现 BadImageFormatException。用谷歌搜索这个异常表明大多数人在编译一个支持 64 位的程序并将 32 位的东西加载到其中时都会遇到这个问题。问题是,我有理由确定我正在生成 16 位 DLL,而且似乎没有解决方法。
我可以下载具有 32 位编译器和链接器的较新的 Borland 5 编译器,但我仍然遇到同样的问题,所以也许我也有问题。
这是我的 C# 调用代码
这是我的 DLL 代码
我的编译器标志和链接器标志都是完全的猜测 - 我希望这是我的主要问题
我注意到我的 DLL 代码没有用 __stdcall、extern "C" 之类的东西装饰。我似乎找不到 Borland C++ 3.0 理解的正确符号集来强制我需要的那种调用约定。
所以,问题:
1) DllImport 是否能够使用从 Borland C++ 3.0 生成的代码 1b) 如果不能,我是否能够移植代码以使用 Borland C+ 5.5.1 编译器,并让 DllImport 使用它?
2)我可以扭转这个问题吗?如果我将 DLL 代码移植到 .NET 中,我是否能够让旧的 Borland 代码调用它?
3) 你有任何其他创新的解决方案可以让我从这个旧的 Borland 项目中简单地提取我需要的代码吗?
c# - 我的 LogonUser DLLImport with String Marshaling 有什么问题?[C#]
出于某种奇怪的原因,当我编组LogonUser DLLImport
参数时,我在使用登录类型时不再能够成功INTERACTIVE
登录,它适用于NETWORK
登录类型。
这是我的代码:
现在,我对 LogonUser的Logon Exception: Logon failure: unknown user name or bad password
调用失败[MarshalAs(UnmanagedType.LPStr)]
了(DLLImport
LogonType.NETWORK
INTERACTIVE
可悲的是,我需要保留它,因为我将它与其他功能一起使用,例如LoadUserProfile
需要对其进行编组(只有这样我才能让它工作而不显示未知的 Windows 字符 [正方形])。我是否需要对字符串进行一些时髦的编组或其他操作以使其正确验证?
任何帮助,将不胜感激。谢谢,
c# - 空闲内存不清除内存块
我正在使用 DllImport 从我自己的 .net 类中调用 c 包装器库中的方法。c dll中的这个方法创建一个字符串变量并返回字符串的指针。
像这样的东西;
然后我使用 Marshall.PtrToStringAnsi(ptr) 读取字符串。在获得字符串的副本后,我只需调用另一个 c 方法 HeapDestroy,它位于调用 free(ptr) 的 c 包装器库中。
这是问题;最近,虽然它像魅力一样工作,但我开始出现“尝试读取或写入受保护的内存区域”异常。经过更深入的分析,我发现,我相信,虽然我为此指针调用了 free 方法,但指针的值并没有被清除,这会在无人看管的情况下填充堆,并使我的 iis 工作进程抛出这个异常。顺便说一下,它是一个网站项目,在c库中调用了这个方法。
你能帮我解决这个问题吗?
当然,这是 C# 代码;
c# - 如何设置 C++ 函数以便 p/invoke 可以使用它?
希望这是一个简单粗暴的问题,但这表明我缺乏 C++ 专业知识。我是一名 C# 程序员,过去我曾使用 P/Invoke 和其他人的 C++/C dll 进行过大量工作。但是,这一次我决定自己编写一个包装器 C++ dll(非托管),然后从 C# 调用我的包装器 dll。
我立即遇到的问题是我无法定义 p/invoke 可以找到的 C++ 函数。我不知道它的语法是什么,但这是我目前正在尝试的:
最初我只是有这个,但它也不起作用:
然后在 C# 方面,我有:
一切都可以编译,但是当我执行这个 C# p/invoke 调用时,我得到一个 System.EntryPointNotFoundException: Unable to find an entry point named 'TestFunc' in DLL 'Plugins\TestDLL.dll'。
当然,这在 C++ 端一定是非常简单的东西,我只是不知道它的语法。
c++ - 将 Windows Dll 转换为 C++ Visual Studio 2008 的 .lib
我知道有一个名为 Dll 的工具,但开发人员要价 1000 美元。我只需要转换一个库,一次,所以很难证明这个价格是合理的。
我试过 IMPLIB32.EXE,但我只是得到空的 .lib 文件。我怎样才能做到这一点?也许我可以编写一个简单的转换应用程序?
补充1:
Dll 通常是 stdcall 而不是 cdecl,并且是用较旧的 C 语言编写的,例如语言不是 C#、.NET 或 C++。我现在需要从 C++ 应用程序中调用它们。SQLite.dll 或 zlib.dll 就是一个例子。我无权访问这些 dll 的 .lib 文件。
补充2:
我为 VS2008 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/重新编写了这段代码, 并在此处包含了可下载的示例 Dll 等: http ://www.transferbigfiles.com/Get .aspx?id=7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a 这反过来会产生一个创建 Dll 的项目。当我尝试编译 Dll 时,出现链接器错误:AddShow.dll:致命错误 LNK1107:无效或损坏的文件:无法在 0x300 处读取此处描述: http: //list.isis.vanderbilt.edu/pipermail/udm-users /2006-March/000664.html 不确定如何继续。如此接近却又如此遥远
接下来我们转向这个方法
http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
运行带有参数 /exports C:\path\to\AddShow.dll 的 dumpbin 完全没有经过一些研究
http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎需要从 common/ide 文件夹 dumpbin.exe 中的 mspdb71.dll(现在是 mspdb80.dll)现在运行时出现错误:
致命错误 LNK1106:无效文件或磁盘已满:无法查找 0x6179A 这些线程表明可能是 dumpbin.exe 的版本问题
我有 Microsoft (R) COFF/PE Dumper 版本 9.00.30729.01
所以我尝试了 Microsoft (R) COFF Binary File Dumper Version 5.12.8078,但没有成功。经过大量阅读,我不再靠近
http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal -error-lnk1106-invalid-file-disk-full.html
当我运行 ProcMon 时,我看到第一次出现 queryopen 和 sqlite3.dll 时 svchost.exe 尝试打开它并失败并出现错误 PATH NOT FOUND。路径是 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL 并且是正确的。如果我将它放在 C 驱动器的根目录下,则会出现 NAME NOT FOUND 错误:
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local
分别来自link.exe 和dumpbin.exe。我使用的是 XPSP3 而不是 Vista,这是我对 sysinternals 知识的限制。这些 .local 文件是什么?
(csrss.exe 也找不到一些清单文件。)
所以还没有成功,只是更神秘
新增 3:
我尝试从安装位置\Program Files\Microsoft Visual Studio 8\VC\bin 运行dumpbin.exe,但操作系统说找不到mspdb80.dll。我从 \Program Files\Microsoft Visual Studio 8\Common7\IDE 复制了 mspdb80.dll 以尝试让 dumpbin.exe 运行。
现在我收到错误:“c1902 程序数据库管理器不匹配,请检查您的安装”
如果我从 \Program Files\Microsoft Visual Studio 8\VC\bin 中删除 mspdb80.dll,错误就会消失!但我无法运行 dumpbin.exe。
新增4:
我终于能够通过将以下文件复制到文件夹来运行 dumpbin:
dumpbin.exe link.exe lib.exe mspdb80.dll
我确实得到了错误:
致命错误 LNK1248:图像大小 (FFFFFXXX) 超出最大允许大小 (80000000)
一次,但更换 dll 解决了这个问题。估计是坏了?
然后我进入说明中的下一步:http: //www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://support .microsoft.com/kb/131313 并得到错误:警告 lnk4017 statement not supported for the target platform ignored 这原来是因为我指定了 .dll 而不是 .def 文件。
然后将生成的 .Lib 和 .exp 文件添加到 VS2008 项目中并编译和运行。调试器随后报告错误:运行时检查失败 #0 - ESP 的值未在函数调用中正确保存...
如此处所述 “运行时检查失败 #0 - ESP 的值未在函数调用中正确保存”在从 GameSpy 库的 C++ 代码成功回调后, 这是因为我在我的 dll 中使用了 stdcall 并在我的应用程序。
因此,将其更改为 __stdcall 应该可以解决您认为的问题.. 但可惜没有。
现在我收到一个链接错误:错误 LNK2001:未解析的外部符号 _AddTwoNum@12
出于某种原因,这是一个装饰函数名称。为什么?
添加了 n:
原来这是因为 .lib 文件是使用带有 STDCALL 函数的 dll 制作的。STDCALL 要求调用者清理堆栈,以便将参数的字节数附加到带有 @ 符号的函数名称中。在这种情况下,我有三个 4Byte 整数,总共 12 个字节。
一旦我从使用 CDECL 调用约定创建的 dll 重新制作了 .lib 文件,那么一切都很好。
dll - 是否有任何本机 DLL 导出函数查看器?
是否有任何免费的本地 Windows DLL 导出函数查看器,它显示函数名称及其参数列表?
c# - 是否可以使用“纯”.NET 和*不*使用 p/invoke 重新启动 PC?
是否可以在不使用 pinvoke 的情况下使用 .NET 重新启动 PC?
我只是重复了标题,但我不太确定如何进一步详细说明!
编辑:
我应该提到不想使用“shutdown -r”作为解决方案。
我真的很喜欢纯粹的.NET方式,比如:
Environment.ShutDown();
换句话说,随着新版本 Windows 的出现,使用 .NET 维护的东西。
编辑2:
请不要再问“p/invoke 有什么问题”。这些答案正是 SO 用户似乎喜欢的;回答问题的所谓“横向”方法。然而,虽然 p/invoke 没有真正的问题,而且我很乐意使用它,但询问 .NET 是否有更正式的实现某事的方式到底有什么问题?如果它在 .NET 中,那么操作系统之间的任何 API 更改都会(很可能)得到反映。不管是什么原因,寻求最小化 DLL 导入使用不是犯罪吗?
我确定我是否在以下问题中包含了一些内容:
你可以这样做:
在座的每个人都会尖叫:“使用有什么问题SomeNamespace.ClimbWall();
??”
叹。