在尝试安装Visual Studio 2012时,我注意到它需要占用我的启动盘的很大一部分作为安装的先决条件:

它需要的驱动器驱动器上的磁盘空间比它生存的目录多一倍!这种疯狂是什么?
做一些搜索,我找到了一个类似问题的用户,但他只能通过卸载所有额外的驱动器来解决他的问题,然后启动安装程序.据推测,他在要安装的驱动器上有一个操作系统.我不.(并且也不想).他的困境在这里概述:https://stackoverflow.com/questions/14466787/why-does-visual-studio-install-onto-multiple-drives
根据上面问题中的建议,我将所有"临时"目录引用移动到指向"E:\"驱动器,尝试将其强制关闭"C:\",如下所示:
但没有骰子.据记载,文件只是暂时的; 如果是这种情况,为什么它坚持将大量文件放到我的启动盘上?我没关系,除了我没有6千兆字节的空间用于这个安装,并且不能足够自由地让它做它的事情.这个磁盘来自消费者固态硬盘的早期阶段,因此这些选择很小,这很好,因为我从来没有想过它可以容纳饥饿的应用程序.
有什么我可以做的,没有扩展磁盘,或荒谬卸载一堆其他应用程序,安装Visual Studio,然后重新安装其他应用程序?考虑到我在另一个驱动器上有太字节的空间,这是一个特别令人沮丧的问题;)
ArgumentOutOfRangeException: Non-negative number required.调用类的ReadTo()方法时,我的代码不确定地抛出SerialPort:
public static void RetrieveCOMReadings(List<SuperSerialPort> ports)
{
Parallel.ForEach(ports,
port => port.Write(port.ReadCommand));
Parallel.ForEach(ports,
port =>
{
try
{
// this is the offending line.
string readto = port.ReadTo(port.TerminationCharacter);
port.ResponseData = port.DataToMatch.Match(readto).Value;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
port.ResponseData = null;
}
});
}
Run Code Online (Sandbox Code Playgroud)
SuperSerialPort是SerialPort类的扩展,主要用于保存端口上每个设备特定的通信所需的信息.
一个端口总是有TerminationCharacter定义的;
大部分时间它都是换行符:

我不明白为什么会这样.
如果ReadTo无法找到输入缓冲区中指定的字符,那么它不应该只是超时并且不返回任何内容吗?
StackTrace指向mscorlib中的一个违规函数,在SerialPort类的定义中:
System.ArgumentOutOfRangeException occurred
HResult=-2146233086
Message=Non-negative number required.
Parameter name: byteCount
Source=mscorlib
ParamName=byteCount
StackTrace:
at System.Text.ASCIIEncoding.GetMaxCharCount(Int32 byteCount)
InnerException:
Run Code Online (Sandbox Code Playgroud)
我跟着它,这就是我发现的:
private int …Run Code Online (Sandbox Code Playgroud) 经过大量的研究和实验,我仍然无法弄清楚我从外部库中访问未管理的函数时遇到的问题.
快速相关的背景故事:我在Visual C++中编写了一个应用程序,用于驱动通过USB连接到系统的外部仪表,但正在虚拟化串口,我注意到了奇怪的输出行为.为了维护自己,制造商希望我使用他们的.dll来控制我的应用程序中的仪表.很好,但....
我无法直接将此.dll作为参考包含(名称和路径已删除):
所以为了使用它,我想起了DllImport.我决定将自己的程序集作为驱动程序的包装器,而不是将代码直接包含在我的应用程序中,因此我可以通过类访问该功能.在.dll上执行dumpbin/exports之后,我找到了所有函数的入口点,并创建了一个C#类库,只包括相关的示例:
namespace Meter
{
public class PortDrv
{
[DllImport("PortDrv.dll", EntryPoint = "SERIALNUMBER",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto)]
public static extern long SerialNumber(Byte Index);
[DllImport("PortDrv.dll", EntryPoint = "OPENPORT",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto)]
public static extern int OpenPort();
};
}
Run Code Online (Sandbox Code Playgroud)
函数原型是从他们发给我描述他们库的.pdf中提取的:
SERIALNUMBER (ByVal Index As Byte) As Long
OPENPORT () As Integer
Run Code Online (Sandbox Code Playgroud)
并且还用于他们的示例VB程序:
Private Declare Function SerialNumber Lib "PortDrv" Alias "SERIALNUMBER" (Index As Byte) As Long
Private Declare Function OpenPort Lib "PortDrv" Alias "OPENPORT" () …Run Code Online (Sandbox Code Playgroud) 正如问题所述,是否有另一种方法可以做到这一点?:
decimal[] decimal_array = new decimal[12];
List<decimal> decimal_list = new List<decimal>(3);
// want to combine the two
List<decimal[]> decimal_list_array = new List<decimal[12]>(3); // doesn't compile
Run Code Online (Sandbox Code Playgroud)
我明白这不会起作用,因为"decimal [12]"不是一个类型,但是当我声明它时,设置结构的大小会很简洁,而不必写decimal_list_array.Add(new decimal[12])一堆次.
我希望能够通过索引上的每个主要操作实例在列表中的对象,但否则我不关心的实际对象的顺序在列表中.
编辑:结构的初始大小在声明时将是已知的,但这只是最小的实例数 List<decimal[]>