我只知道非基元(对象)进入堆,方法进入堆栈,但原始变量呢?
--update
根据答案,我可以说堆可以有一个新的堆栈和给定对象的堆?鉴于该对象将具有原始和引用变量..?
我正在研究客户端 - 服务器应用程序,我希望客户端使用用户的登录凭据向服务器验证自身,但我不希望用户必须输入他们的用户名和密码.我当然不想负责安全处理密码.我只需要用户向我证明他们是他们所说的人,然后我的服务器就可以继续执行并随意授予/拒绝命令.
我的用户是域的一部分,因此我希望能够使用他们登录时创建的登录凭据.
我没有使用任何类型的Web服务,也不想使用.我控制客户端和服务器软件,两者都是用纯C#编写的,并使用好的插槽来完成工作.
我更喜欢用纯C#/ .Net来做这件事,但我愿意使用不安全的C#和pinvokes到win32 API,如果这意味着我将完成工作.
我已经在Windows中阅读了一些关于SSPI的内容,但是我在黑暗中有点感觉,因为这种应用程序开发对我来说是新的.
有人知道怎么做这个吗?SSPI是这样的吗?如何在C#中使用SSPI?是否有.Net原生方式,以便我的代码可以保持可移植性?
我有一个与Microsoft的Exchange租户(company.onmicrosoft.com),一个管理员帐户(admin@company.onmicrosoft.com),以及管理我的(设置)的管理页面.
最近,有一个项目我通过C#从管理页面自动解析一些Web数据.我阅读了很多与SharePoint相关的文章,并阅读了有关STS,SRF文件和主动/被动联合服务的文章.
那么,让我们来看看:
我从https://login.microsoftonline.com/login.srf开始,但是Fiddler意识到我可以直接跳到https://login.microsoftonline.com/ppsecure/post.srf并获得相同的结果.
所以,我去登录,输入我的凭据,然后转发给我管理页面.很简单吧?
所以,我决定复制网络流量,并依赖以下帖子和示例:
所有这些网站在屏幕抓取认证,ADFS和一堆其他有用信息上都有很棒的C#示例.问题是所有这些都是针对SharePoint的.
所以,我混合并匹配代码并提出以下内容:
static void Main3()
{
CookieContainer cookies = new CookieContainer();
//using Bungie example from http://stackoverflow.com/questions/2508656/logging-into-a-site-that-uses-live-com-authentication
//Uri url = new Uri("https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1268167141&rver=5.5.4177.0&wp=LBI&wreply=http:%2F%2Fwww.bungie.net%2FDefault.aspx&id=42917");
Uri url = new Uri("https://portal.microsoftonline.com/");
HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create(url);
http.Timeout = 30000;
http.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0";
http.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
http.AllowAutoRedirect = false;
http.Headers.Add("Accept-Language", "en-us,en;q=0.5");
http.Headers.Add("Accept-Encoding", "gzip, deflate"); //this option creates the two cookies but …Run Code Online (Sandbox Code Playgroud) 我正在使用指南来创建一个基本的Jira插件,作为一种实验/实践方式来熟悉Jira SDK并创建有关Listeners的插件.我在VM上运行Ubuntu,然后我按照指南中的所有步骤操作.我的虚拟机开始冻结,我认为最初可能是Jira,但现在我知道虚拟机本身有问题.我收到此错误:
虚拟机执行期间发生错误!错误详细信息如下所示.您可以尝试更正错误并恢复虚拟机执行.I/O缓存在更新介质"ahci-0-0"(rc = VERR_DEV_IO_ERROR)中的数据时遇到错误.确保磁盘上有足够的可用空间并且磁盘工作正常.之后可以恢复操作.
细节说:
fatal = false,errorID = BLKCACHE_IOERR
我查看了日志文件,这是出错的地方/抛出错误:
00:01:06.499361 I/O缓存:将偏移量为102912000(110592字节)的条目写入介质"ahci-0-0"时出错(rc = VERR_DEV_IO_ERROR)
不太确定该怎么做.我在VM中有重要的东西,我真的不想再重新设置它.
约束执行区域是C#/ .Net的一个特性,它允许开发人员尝试从关键的代码区域中提升"三大"异常--OutOfMemory,StackOverflow和ThreadAbort.
CER通过推迟ThreadAborts,准备调用图中的所有方法来实现这一点(因此不会发生JIT,这可能导致分配),并确保有足够的堆栈空间来适应随后的调用堆栈.
典型的不间断区域可能如下所示:
public static void GetNativeFlag()
{
IntPtr nativeResource = new IntPtr();
int flag;
// Remember, only the finally block is constrained; try is normal.
RuntimeHelpers.PrepareConstrainedRegions();
try
{ }
finally
{
NativeMethods.GetPackageFlags( ref nativeResource );
if ( nativeResource != IntPtr.Zero ) {
flag = Marshal.ReadInt32( nativeResource );
NativeMethods.FreeBuffer( nativeResource );
}
}
}
Run Code Online (Sandbox Code Playgroud)
上述内容大部分都很好,因为CER内部没有任何规则被破坏 - 所有.Net分配都在CER之外,Marshal.ReadInt32()具有兼容性ReliabilityContract,我们假设我的NativeMethods被类似地标记,以便VM可以正确地考虑他们在准备CER时.
因此,除了所有这些之外,您如何处理分配必须在CER内部发生的情况?分配违反规则,因为很有可能获得OutOfMemoryException.
在查询本机API(SSPI的QuerySecurityPackageInfo)时,我遇到了这个问题,这会迫使我违反这些规则.本机API确实执行自己的(本机)分配,但如果失败,我只得到一个空的结果,所以没有什么大不了的.但是,在它分配的结构中,它存储了一些未知大小的C字符串.
当它返回指向它所分配的结构的指针时,我必须复制整个事物,并分配空间来存储这些c字符串作为.Net字符串对象.毕竟,我应该告诉它释放分配.
但是,由于我在CER中执行.Net分配,我违反规则并可能泄漏一个句柄.
处理这个问题的正确方法是什么?
对于它的价值,这是我天真的方法:
internal static SecPkgInfo GetPackageCapabilities_Bad( string packageName )
{
SecPkgInfo info; …Run Code Online (Sandbox Code Playgroud) 总结:我正在尝试创建套接字以在同一台机器上存在的两个物理接口之间传递数据,而 Win32 套接字总是直接在内核中转发流量,而不是通过物理接口推送。有没有办法禁用这种行为,也许是通过设备设置、注册表调整、路由表恶作剧或套接字选项?我们使用的是 Windows XP SP3。
一些背景。我正在尝试构建一些完全自动化的 IP 测试来测试我们的自定义 IPv4 设备。我们有一个大型的 Windows XP 机器实验室,以及我们连接的每个设备的单独物理以太网接口。我们的设备实际上是以太网路由器,每个路由器都有自己的 IP。
我们需要通过我们的设备将数据从实验室机器发送出去,然后返回到同一台计算机中。我们将通过设备发送单播和多播 UDP、TCP 和广播 IP 流量。
我们希望(并且可能需要)流量起源于它注定要到达的同一台机器上。为此,我们配置了两个单独的 NIC,每个 NIC 在自己的子网上都有自己的 IP,例如 NIC #1 使用 10.0.0.1/24,NIC #2 使用 10.0.1.1/24。我们的设备就像简单的直通路由器一样,有两个接口,一个在 10.0.0.0/24 子网上,一个在 10.0.1.0/24 子网上,它们只是来回转发数据包。
为了生成我们的数据,我们希望能够使用 Win32 套接字,因为它很好理解,得到很好的支持,我们的客户正在使用什么,并且可能是最快速的方法。数据包注入对于 UDP 和广播 IP 可能是可行的,但对于 TCP 很可能不是。我会接受使用数据包注入的想法,但更喜欢标准的 Win32 套接字。
正如摘要中所述,数据包永远不会离开机器。我像个疯子一样在谷歌上搜索,但没有找到太多。有任何想法吗?
我非常熟悉非终结类型的Dispose模式,例如,包含我们想要进行确定性清理的某种托管资源的类型.这些类型通常不实现终结器,因为它完全没有必要.
但是,我正在为本机API实现一个C#包装器,其中包含多个相关的非托管资源,并且看起来需要多个类,每个类都实现了finalizable-dispose模式.问题是配置模式的指导方针说最终的A不应该依赖于最终的B,这正是我需要的:
X不要在终结器代码路径中访问任何可终结的对象,因为它们已经完成的风险很大.
例如,具有对另一个可终结对象B的引用的可终结对象A不能在A的终结器中可靠地使用B,反之亦然.终结器以随机顺序调用(缺少关键终结的弱排序保证).
所以这是我的约束:
本机API看起来像这样:
APIHANDLE GizmoCreateHandle();
CHILDHANDLE GizmoCreateChildHandle( APIHANDLE apiHandle );
GizmoCloseHandle( APIHANDLE apiHandle );
GizmoCloseChildHandle( APIHANDLE apiHandle, CHILDHANDLE childHandle);
Run Code Online (Sandbox Code Playgroud)
对此的天真方法将分为两部分:
所以一切都看起来像这样:
[DllImport( "gizmo.dll" )]
private static extern ApiSafeHandle GizmoCreateHandle();
[DllImport( "gizmo.dll" )]
private static extern void GizmoCloseHandle( IntPtr apiHandle );
[DllImport( "gizmo.dll" )]
private static extern ChildSafeHandle GizmoCreateChildHandle(ApiSafeHandle apiHandle);
[DllImport( "gizmo.dll" )]
private static extern void GizmoCloseChildHandle( ApiSafeHandle apiHandle, IntPtr childHandle );
[DllImport( "gizmo.dll" …Run Code Online (Sandbox Code Playgroud) 在做了一些分析之后,我们发现我们的应用程序连接字符串的当前方式会导致大量的内存流失和 CPU 时间。
我们正在构建一个List<string>长度为 50 万个元素的字符串来连接,引用数百兆字节的字符串。我们正在尝试优化我们应用程序的这一小部分,因为它似乎占用了不成比例的 CPU 和内存使用量。
我们做了很多文本处理:)
从理论上讲,我们应该能够在单个分配和 N 个副本中执行连接——我们可以知道我们的字符串中有多少个可用字符,所以它应该就像总结组件字符串的长度并分配足够的一样简单底层内存来保存结果。
假设我们从一个 pre-filled 开始List<string>,是否可以使用单个分配连接该列表中的所有字符串?
目前,我们正在使用StringBuilder该类,但它存储了所有字符的自己的中间缓冲区 - 因此我们有一个不断增长的块数组,每个块存储我们提供给它的字符的副本。远非理想。块数组的分配并不可怕,但最糟糕的是它分配了中间字符数组,这意味着 N 次分配和副本。
我们现在能做的最好的事情就是调用List<string>.ToArray()——它执行一个 500k 元素数组的副本——并将结果传递string[]给string.Concat(params string[]). string.Concat()然后执行两次分配,一次将输入数组复制到内部数组中,另一次分配目标字符串的内存。
来自 referencesource.microsoft.com:
public static String Concat(params String[] values) {
if (values == null)
throw new ArgumentNullException("values");
Contract.Ensures(Contract.Result<String>() != null);
// Spec#: Consider a postcondition saying the length of this string == the sum of each string in array
Contract.EndContractBlock();
int totalLength=0;
// …Run Code Online (Sandbox Code Playgroud) 在夜间构建计算机上构建的应用程序在Windows Server 2012上不起作用,但在其他桌面上运行正常.
"尝试读取或写入受保护的内存"的例外情况.这通常表明其他内存已损坏.被扔了.
当我在WindowsServer2012机器和构建机器上使用远程调试进行调试时,我看到在代码中调用了kernel32调用HeapSize的地方抛出了这个异常.以下是HeapSize导入和调用的方式:
[DllImport("kernel32")]
static extern int HeapSize(int hHeap, int flags, void* block);
// Returns the size of a memory block.
public static int SizeOf(void* block)
{
int result = HeapSize(ph, 0, block);
if (result == -1) throw new InvalidOperationException();
return result;
}
Run Code Online (Sandbox Code Playgroud)
这被称为不安全类的构造函数的一部分:
public UnManagedBuffer(StringBuilder sb)
{
PtrStart = (byte*)Marshal.StringToHGlobalAnsi(sb.ToString());
Size = UnManagedMemory.SizeOf(PtrStart);
PtrWriteNextValue = PtrStart + Size - 1;
PtrReturnNextValue = PtrStart;
}
Run Code Online (Sandbox Code Playgroud)
关于什么可能遗失的任何线索以及如何解决这个问题?
这就是我在Windbg中看到的:
EventLog显示:
Log Name: Application
Source: .NET Runtime …Run Code Online (Sandbox Code Playgroud) 我想创建一个C#程序,调用托管C++ DLL,然后在本机C++ DLL中执行功能.作为此调用的一部分,我想提供一个可以由本机C++ dll调用的C#回调函数.
C#代码将调用一些托管C++代码,这些代码将调用以下本机C++代码; 我希望本机C++代码调用我的C#回调cb:
int dobatch(CString str)
{
// I want to to call c#
if (cb)
return(cb(str)); // this would execute the function passed from c#.
}
Run Code Online (Sandbox Code Playgroud)
任何想法......我似乎无法让C#回调与dobatch()通过托管C++ dll 调用本机C++ 函数混合.