问题标签 [intptr]
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.
vb.net - .NET 1.1 WSDL - 无法使用 IntPtr (WindowsIdentity.Token) 作为 WebMethod 的输入参数(ASMX Web 服务)
对于使用 ASMX Web 服务的旧版 winforms VB.NET 1.1 应用程序,我们处于一种奇怪的情况。尝试将 WindowsIdentity 对象中的用户令牌作为参数发送到 WebMethod。我将添加一个'HACK:评论。
令牌是 IntPtr 类型,第一个问题是生成的 WSDL 不支持 IntPtr,错误为“不支持的类型”
我知道这是一个很大的 WTF 问题,听起来不安全,所以欢迎任何简单有用的替代方案,但我们如何更改这个系统有很多限制,包括托管环境的复杂性。因此,我只想将我们的数据块传输到 Web 服务,以节省很多其他的麻烦。
问题 1
WSDL 生成错误:
另一种方法(扩展 WTF 因素) - 试图解决 IntPtr 问题是将 IntPtr 放入 System.IO.Stream 使用
在 winforms 应用端和服务上的 BF.Deserialize() 上。但这导致了一个新的奇怪问题。
以这种方式定义 Web 服务方法的签名:
新的奇怪问题出现在客户端作为编译错误,好像 Stream 的“System.IO”资格被忽略,并被解释为 UserService 类的一部分......
问题 2
因此,对任何一个问题或类似的替代方法的答案都会很棒......
c# - 究竟什么是 IntPtr?
通过使用 IntelliSense 并查看其他人的代码,我遇到了这种IntPtr
类型;每次需要使用它时,我都会简单地放置null
或IntPtr.Zero
发现大多数功能都可以工作。它到底是什么以及何时/为什么使用它?
c# - IntPtr cast 与 new
我只是在看一个例子,在里面我看到了代码
在浏览了我们的代码之后,我发现我们已经使用了类似的模式,但是在我们的代码中,我们几乎有相同的东西:
这两种取法有区别吗?第二个是否会以任何方式“更好”,因为它不分配新内存,或者演员只是将相同的构造函数隐藏在下面?
c# - 如何在 C# 中将位图图像转换为 IntPtr?
我从我看到的一个例子中做了这个,它从来没有抛出任何错误,但图像显示为灰色。
有一个更好的方法吗?
PS:我检查了 csproj 以允许构建中的不安全代码。
c# - 编组 SIZE_T* 的正确方法?
我有以下 C++ 函数定义,我试图通过 PInvoke 从托管代码中调用它:
我的托管声明如下所示:
你们中的一些人可能会注意到我最终遇到的相同错误。这不是 64 位可移植的。SIZE_T 的大小可变(32-64 位),指向它的指针也是如此。在托管大小上,指针正确转换为 64 位,但 uint 没有,您最终可能会在 arg1 的高位中出现垃圾。这是一个特别持久的错误,因为垃圾通常只是零:(
我得到工作的唯一解决方案是以下托管声明:
这当然有效,因为 IntPtr 可以正确地改变它的大小。在我的代码中,我只是将 IntPtr 视为一个整数,并且它可以工作,尽管它看起来像一个丑陋的黑客。在我看来,应该有某种方法来正确指定它,也许使用 UnmanagedType.SysUInt,但我无法提出任何其他可行的解决方案。
c# - IntPtr 算术
我试图以这种方式分配一个结构数组:
我想访问分配的数据“绑定”一个结构到使用 AllocHGlobal 分配的数组中的每个元素......像这样
但我没有找到任何方便的方法......为什么 IntPtr 缺乏算术?如何以“安全”的方式解决此问题?
有人可以确认 PtrToStructure 函数将数据复制到结构变量中吗?换句话说,修改结构体是否反映了结构体数组数据的修改?
当然,我想使用结构对 IntPtr 指向的数据进行操作,而不是每次都复制数据,避免不安全的代码。
谢谢大家!
c# - 要调用需要 IntPtr 的方法,是使用 /unsafe 还是 Marshal.AllocHGlobal 更好?
我有一个类将在整个应用程序期间持续存在一些实例。这些对象都需要调用一个 dll 方法,该方法从现有的 float[] 缓冲区中附加数据,并将完整的数据集传递给一个接受 IntPtr(浮点数组)的 DLL 方法,每秒几次。将其作为非托管代码执行是否更好:
还是使用不安全的标签并修复会更好?
不必在编译器中使用“不安全”标签有什么好处吗?元帅级实际上是否“更安全”?这些方法中哪一种通常具有更好的性能?
_floats
我倾向于前者,只是因为这样 GC在清理内存空间时不必担心(这可能非常大)。这是一个合理的担忧吗?建议是否取决于 ArraySize 的大小?
c# - C# - 使用 Marshal.Copy() 的缓冲区损坏
我收到一个 IntPtr 和一个 int 指定它指向的字节数。数据可以包含任何字符,包括 null、EOL 等。尝试以下操作时,缓冲区已损坏:
我会假设'buffer'和'ptr'将指向不同内存位置中的同一个缓冲区blob,但它们没有(我只是将相同的数据复制到另一个内存位置AFAIK)。但是,'ptr' 似乎指向任意内存位置,因为它包含对 DLL 模块的字符串引用。
有任何想法吗?谢谢!
c# - IntPtr 添加
因此,据我所知,我发现的每个 IntPtr 添加的托管示例都是错误的。
例如: http: //www.atalasoft.com/cs/blogs/stevehawley/archive/2006/10/16/10987.aspx
我的想法是,如果 IntPtr 在 32 位系统上位于(或接近)int32.MaxValue,并且您添加了一个溢出 int32 的偏移量,那仍然不是有效的内存地址(因为它在 uint32 中有效,并且将在 IntPtr 中用负数表示)?!
我相信代码应该是这样的:
我疯了吗?
有没有人有一个经过验证的真实 IntPtr 添加示例?
c# - .NET 互操作 IntPtr 与 ref
可能是一个菜鸟问题,但互操作还不是我的强项之一。
除了限制重载的数量之外,我还有什么理由应该声明我的 DllImports,例如:
并像这样使用它们:
而不是创建有针对性的重载:
并像这样使用它:
by ref 重载最终更容易使用,但我想知道是否存在我不知道的缺点。
编辑:
到目前为止,有很多很棒的信息。
@P Daddy:你有一个基于抽象(或任何)类的结构类的例子吗?我将签名更改为:
没有In
,Out
和MarshalAs
SendMessage (我的测试中的 EM_GETCHARFORMAT)失败。上面的示例运行良好,但如果我将其更改为:
我得到一个 System.TypeLoadException,它说 CHARFORMAT2 格式无效(我将尝试在此处捕获它)。
例外:
无法从程序集“CC.Utilities,Version=1.0.9.1212,Culture=neutral,PublicKeyToken=111aac7a42f7965e”加载类型“CC.Utilities.WindowsApi.CHARFORMAT2”,因为格式无效。
NativeStruct 类:
我试过abstract
了,添加StructLayout
属性等,我得到了同样的例外。
编辑:
我没有按照常见问题解答,我问了一个可以讨论但没有得到肯定回答的问题。除此之外,该线程中还有很多有见地的信息。所以我会把它留给读者投票给答案。第一个投票超过 10 票将是答案。如果两天内没有答案(太平洋标准时间 12 月 17 日),我将添加我自己的答案,总结线程中的所有美味知识:-)
再次编辑:
我撒了谎,接受了 P Daddy 的回答,因为他是男人并且帮了很大的忙(他也有一只可爱的小猴子 :-P)