我想我在Visual Studio 2013 Update 2的调试器中发现了一个错误.当我从一个抽象类派生并覆盖一个接受带有两个字符串的结构的抽象方法时,调试会话崩溃并发生AccessViolationException.
此行为在64位体系结构和.NET Framework 4.0及更高版本(4.5和4.5.1)上出现.
重现步骤:
现在我的问题:
感谢您的时间.
码:
using System;
using System.Collections.Generic;
using System.Text;
namespace test
{
class Program
{
static void Main(string[] args)
{
Structure structure = new Structure();
Caller caller = new Caller();
caller.Execute(structure);
}
}
public abstract class Father
{
internal Father()
{
}
public abstract bool Execute(Structure structure);
}
public class Caller : Father
{
public Caller() : base()
{
} …Run Code Online (Sandbox Code Playgroud) 根据问题 #1793,不需要使用像这样的怪癖将 .NET 5 中的 HttpClient 绑定到特定的本地 IP 地址。
然而,我对这个主题完全不知所措,同时 .NET Core 开发人员多年来一直无法为 .NET Core 提供选择 http 请求的传出 IP 地址的选项。即使向后兼容的 WebClient 也无法在早期的 .NET Core 版本中执行此操作,任何其他高级 HTTP API 也无法执行此操作。上帝(或任何人)赞扬 .NET 5,它应该(希望如此?)将此类功能带回现代 .NET 框架。
如何配置HttpClient对象以仅使用 .NET 5 中的 on-bord 方法为传出连接选择特定的本地 IP 地址?还是仍然不可能?附加问题:如何配置ClientWebSocket对象以仅使用 .NET 5 中的 on-bord 方法为传出连接选择特定的本地 IP 地址?
在我的设置中,计算机有多个 IP 地址,并且我正在访问的服务根据源 IP 地址有相当严格的速率限制。
请不要告诉我,操作系统会选择要使用的正确适配器或 IP 地址。请不要将我发送到第三方图书馆。是的,即使他们WebClient在这方面解决了我也不想使用它。
其他感兴趣的问题:
当我通过outlook或gmail向gmail电子邮件地址发送电子邮件时,我可以添加直接显示在gmail web界面中的内嵌图像:
工作电子邮件的相关原始邮件标题和原始正文部分:
--089e0158b6909948880520cef593
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Image there?<div><img src=3D"cid:ii_if3zqhar0_15014363be0a=
41b2" width=3D"10" height=3D"3"><br>=E2=80=8BHope so!<br></div></div>
--089e0158b6909948880520cef593--
--089e0158b69099488c0520cef594
Content-Type: image/png; name="test.png"
Content-Disposition: inline; filename="test.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_if3zqhar0_15014363be0a41b2>
X-Attachment-Id: ii_if3zqhar0_15014363be0a41b2
iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAIAAAAlXwkiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAADFJREFUeNpi+A8BDCf/wwDD/1VIbBABIudDmAchokwgag9QAiwHVcsM
Z/5fCdYJEGAAuthJ+AVi5KgAAAAASUVORK5CYII=
--089e0158b69099488c0520cef594--
Run Code Online (Sandbox Code Playgroud)
完整的原始电子邮件:工作原始电子邮件.
但是,当我通过它发送这样的电子邮件时System.Net.Mail,.NET它不能在gmail web界面中工作,而是任何其他电子邮件客户端(outlook,iphone等):
非工作电子邮件的相关原始邮件头和原始部分:
----boundary_3_6a0761ee-57e2-4bdd-b1f1-7302b3c8a7a1
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Image there?<br /><img src=3D"cid:test.png@71236720.91827344" /><=
br />Hope so!
----boundary_3_6a0761ee-57e2-4bdd-b1f1-7302b3c8a7a1--
----boundary_5_979e00c0-3fb9-46a0-b25c-1cee82cc15eb
Content-Type: image/png; name=test.png
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=test.png
Content-ID: <test.png@71236720.91827344>
iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAIAAAAlXwkiAAAAGXRFWHRTb2Z0d2FyZQBB
ZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpi+A8BDCf/wwDD/1VIbBABIudDmAch
okwgag9QAiwHVcsMZ/5fCdYJEGAAuthJ+AVi5KgAAAAASUVORK5CYII=
----boundary_5_979e00c0-3fb9-46a0-b25c-1cee82cc15eb--
Run Code Online (Sandbox Code Playgroud)
完整的非工作原始电子邮件:非工作原始电子邮件.
这是我发送内联图片的代码:
SmtpClient …Run Code Online (Sandbox Code Playgroud) 我最近了解到在 .NET 中固定不是实际过程。它“只是”在 IL 中创建一个固定的局部变量,并且该变量指向的所有内容都被认为是由 GC 固定的。您可以在此处阅读更多相关信息。
现在我想知道:是否可以固定 aclass或structso的字段,object使其指向的字段假定为由 GC 固定而不使用GCHandle左右。像这样(伪代码!):
public unsafe [class|struct] Something
{
public byte[] Data = new byte[4096];
private /*some keywords*/ byte* ptr = /*some keywords like fixed*/ Data;
}
Run Code Online (Sandbox Code Playgroud)
如果这在普通 C# 中是不可能的,那么在使用 IL 时是否可能?还是不能struct或class字段有固定对象的效果?(也许只有局部变量才有可能?)
我目前正在做微基准测试,以便更好地理解clr性能和版本问题.所讨论的微基准测试是将每个64字节的两个字节数组合并在一起.
在尝试使用unsafe依此类推.net框架实现之前,我总是使用安全的.net进行参考实现.
我的参考实现是:
for (int p = 0; p < 64; p++)
a[p] ^= b[p];
Run Code Online (Sandbox Code Playgroud)
其中,a和b是byte[] a = new byte[64]和充满了来自.NET RNG数据.
此代码在x64上运行速度是x86上的两倍.首先,我认为这是正常的,因为JIT会使像*long^=*long了出来,并*int^=*int在x86.
但我优化的不安全版本:
fixed (byte* pA = a)
fixed (byte* pB = b)
{
long* ppA = (long*)pA;
long* ppB = (long*)pB;
for (int p = 0; p < 8; p++)
{
*ppA ^= *ppB;
ppA++;
ppB++;
}
}
Run Code Online (Sandbox Code Playgroud)
运行速度比x64参考实现快4倍.所以我对编译器的想法*long^=*long和*int^=*int优化是不对的.
参考实现中的这种巨大性能差异来自何处?现在我发布了ASM代码:为什么C#编译器也不能以这种方式优化x86版本?
用于x86和x64参考实现的IL代码(它们是相同的):
IL_0059: ldloc.3 …Run Code Online (Sandbox Code Playgroud) 当delegate在C#中使用匿名s时,CLR将在堆上为已使用的变量生成本地的副本(例如,当前作用域中的变量).对于当前作用域的每个声明变量,这样的local将被放到堆上.
您可以在此示例中看到此行为:
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
ThreadPool.QueueUserWorkItem(delegate { execute(i); });
Thread.Sleep(1000);
Console.WriteLine();
for (int i = 0; i < 5; i++)
{
int j = i;
ThreadPool.QueueUserWorkItem(delegate { execute(j); });
}
Thread.Sleep(1000);
}
static void execute(int number)
{
Console.WriteLine(" * NUM=" + number.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是(顺序可能在最后5个条目上有所不同,而在第一个条目上也可能得到低于5的数字):
* NUM=5
* NUM=5
* NUM=5
* NUM=5
* NUM=5
* NUM=0
* NUM=1
* NUM=2
* NUM=3
* …Run Code Online (Sandbox Code Playgroud) 我目前正在进行微基准测试,以便更好地理解clr到本机代码的性能.在下面的例子中,我得到一个StackOverflowException,当编译为release并执行时没有连接调试器.编译为debug-build或运行附带调试器的程序时,我没有得到异常.此外,我也只使用SuppressUnmanagedCodeSecurityAttribute-Attribute 获得此错误.
我使用c和VS2013(platformtoolset = v120)构建了一个dll,其中包含一个函数:
__declspec(dllexport) int __cdecl NativeTestFunction(int a, int b, int c, int d)
{
return a + c + b + d;
}
Run Code Online (Sandbox Code Playgroud)
在我的C#程序中,我DllImport用来调用这个函数并进行一些时序测量:
[DllImport("Native.dll", EntryPoint = "NativeTestFunction")]
static extern int NativeTestFunction(int a, int b, int c, int d);
[DllImport("Native.dll", EntryPoint = "NativeTestFunction"), SuppressUnmanagedCodeSecurityAttribute]
static extern int NativeTestFunctionSuppressed(int a, int b, int c, int d);
static void Main(string[] args)
{
byte[] data = new byte[64];
int c = 0;
Stopwatch sw …Run Code Online (Sandbox Code Playgroud) c# ×7
.net ×4
.net-5 ×1
.net-core ×1
64-bit ×1
clr ×1
dllimport ×1
gmail ×1
performance ×1
stackalloc ×1
threadpool ×1
x86 ×1