使用 Specflow 2.1、NUnit 3.4 和 Visual Studio 2015,我正在修复将我的源代码提交到 git。当我到达Foobar.feature.cs它时说它是自动生成的。我在 csproj 文件中看到它被编译(有意义)并且它取决于功能文件,并且它是生成的。
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Foobar.feature.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Foobar.feature</DependentUpon>
</Compile>
<Compile Include="FoobarSteps.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="packages.config" />
<None Include="Foobar.feature">
<Generator>SpecFlowSingleFileGenerator</Generator>
<LastGenOutput>Foobar.feature.cs</LastGenOutput>
</None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
所以没有什么不寻常的地方。在我的代码被推入 origin/master 后,我们将启动 jenkins 构建,所以出于好奇,我将 feature.cs 文件移出,尝试构建,但由于缺少文件,构建失败。我打开了功能文件,没有做任何更改,但点击保存(以便生成器创建文件),现在构建再次工作。
有没有解决的办法?当可以生成时,我宁愿不在源代码中自动生成代码。
所以我一直在努力解决这个问题.我正在尝试将自己的AES 128库用于我的一个程序.该库测试并在C++中工作(适用于加密功能..我还没有实现其他功能)'加密'功能是这样的:
新代码
void Aes128Class::EncryptBlock(BYTE* outBlock, const BYTE* inBlock, const BYTE* cipherBlock)
{
BYTE temp[16] = {0x00};
Galois::XorBlock(temp, inBlock);
Galois::XorBlock(temp, cipherBlock);
BYTE expandedKey[176] = {0x00};
memcpy(expandedKey, Key, 16);
Galois::expand_key(expandedKey);
Galois::XorBlock(temp, expandedKey);
for(int i=16; i<160; i+=16)
{
Galois::DoRound(temp, &expandedKey[i]);
}
Galois::SubBytes(temp);
Galois::ShiftRows(temp);
Galois::XorBlock(temp, &expandedKey[160]);
memcpy(outBlock, temp, 16);
}
void Aes128Class::EncryptData(BYTE* outBlock, size_t& outlen, const BYTE* inBlock, size_t length)
{
float blockSize = (float)(length/16);
blockSize = ceilf(blockSize);
int newLength = (int)(blockSize*16);
BYTE* temp = (BYTE*)malloc(newLength);
BYTE* padd = (BYTE*)malloc(newLength);
memset(temp, 0, newLength); …Run Code Online (Sandbox Code Playgroud) private void AllowOtherSelectors(bool value)
{
foreach (var c in this.Parent.Controls)
{
if (c == this)
continue;
if (!(c is RoundGroupedSelector))
continue;
var rgs = c as RoundGroupedSelector;
rgs.AllowMultiple = value;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这段代码有效但我觉得它可以从使用LINQ中受益.该程序将在具有Atom处理器的平板电脑上使用,因此我只是在寻找所使用的资源/周期最少.
所以,我发现有几个例子,但没有准确,因为我想它(接近虽然)
我正在寻找的例子
byte[] array = { 0x02, 0x64, 0x40, 0x40, 0x03 };
string text = SomeMagicalMethod(array);
//displays <STX>FOO<ETX>
Run Code Online (Sandbox Code Playgroud)
有一次,我有一个字典,其中包含不可打印的字符值和<...>内容,但是将2个字符串组合起来就是我的头脑.我目前有这个,但它ASCIIEncoding取出所有控制字符.
public static void Add(this TextBox tb, byte[] array)
{
string input = System.Text.ASCIIEncoding.ASCII.GetString(array);
Regex.Replace( input ,
@"\p{Cc}" ,
a => string.Format( "[{0:X2}]" , (byte)a.Value[0] )
) ;
Add(tb, input);
}
public static void Add(this TextBox tb, string text)
{
text += ENTER;
tb.Dispatcher.Invoke( DispatcherPriority.Background,
new Action(delegate() { tb.Text += text; })
);
}
Run Code Online (Sandbox Code Playgroud)
编辑 使用NUnit我针对这些测试运行了已解答的代码.最后一个有一个超出0x7F范围的值.虽然这将使用的代码不应该有,但最好是安全,然后抱歉.
[TestFixture]
public class StringExtensionsTest …Run Code Online (Sandbox Code Playgroud) 所以这是一个相当小的问题,有一个很大的解释.正如标题所述,我得到一个未处理的异常,告诉我我的安全句柄已经关闭.我可能要做的是使用越来越多的代码编辑这篇文章几次,以帮助我诊断出问题所在.
我正在使用POS for .NET为我的RFID和MSR设备制作服务对象.虽然我的设备是相同的,但我有2个不同的虚拟COM端口芯片可以与这些设备通信.一个是Silicon实验室,另一个是FTDI.我想使用POS for .NET的即插即用功能,所以我给它提供了我的硬件ID.因为它是即插即用的,我有完整的硬件路径可供我使用,然后我可以使用对PInvoke的调用创建一个SafeFileHandle并使用该SafeFileHandle创建一个FileStream.FTDI芯片不允许我直接与设备通信,所以我必须得到设备的友好名称,然后使用互斥锁拉出COM端口,然后创建一个SerialPort实例.这一步很好,很棒.作为一个FYI,我试图使用两个芯片的友好名称来获取COM端口,并且使用Ports GUID使用SetupAPI.GetDeviceDetails不会列出Silicon Labs(由于一些奇怪的原因).我不确定那个,因为在设备管理器中Silicon实验室设备类Guid是Ports GUID.
好吧,因为SerialPort和FileStream都有一个Stream对象,我决定使用它来读取和写入该端口.问题在于,如果我向MSR设备发送RFID命令,则MSR设备不会响应任何内容.因此,如果我使用此代码,int fromReader = ReaderStream.ReadByte();我的线程将被阻止.这是一个阻塞调用,需要至少1个字节才能继续.所以我环顾四周,似乎唯一的解决方案是使用单独的线程并设置超时.如果发生超时,则中止线程.
Thread t = new Thread(new ThreadStart(ReadFromStream));
t.Start();
if (!t.Join(timeout))
{
t.Abort();
}
Run Code Online (Sandbox Code Playgroud)
(t.Abort被try/catch包围无济于事,因为它没有解决我删除它的问题)
ReadFromStream是RFID设备中的抽象方法.这是其中一个实现
protected override void ReadFromStream()
{
var commandLength = USN3170Constants.MIN_RESPONSE_LENGTH;
var response = new System.Collections.Generic.List<byte>(USN3170Constants.MIN_RESPONSE_LENGTH);
for (int i = 0; i <= commandLength; i++)
{
int fromReader = ReaderStream.ReadByte();
if (fromReader == -1) break; //at end of stream
response.Add((byte)fromReader);
if (response.Count > USN3170Constants.DATA_LENGTH_INDEX && response[USN3170Constants.DATA_LENGTH_INDEX] > 0)
{
commandLength = response[USN3170Constants.DATA_LENGTH_INDEX] + …Run Code Online (Sandbox Code Playgroud) 我不确定这是否可行.我正在尝试学习一些关于lambda表达式的知识,因为我和我的好友一起写了一个程序.所以他有一个与MS SQL服务器对话的Database类.我想对类进行一些测试,因此制作了一个简单的压缩数据库,在我的TextFixtureSetup中填充表(现在有2个表),然后在拆解时删除所有数据.他的数据库类使用类似这样的东西进行SQL连接
protected void WithConnection(Action<SqlConnection> sqlBlock)
{
try
{
using (SqlConnection connection = new SqlConnection(this.ConnectionString))
{
connection.Open();
sqlBlock(connection);
}
}
catch (Exception ex)
{
Console.WriteLine(@"Exception during database connection: {0}", ex);
}
}
Run Code Online (Sandbox Code Playgroud)
我想我找到了Jon Skeet用几乎相同的代码回答的帖子./sf/answers/74417871/
我认为这很酷,但我的模拟数据库使用SQLCEReader.我做了一些研究,发现他们共享一个共同的类System.Data.Common.DbDataReader,它只有一个级别.我没有检查过多少,但我在考虑是否有可能使用多态风格的方式来使用WithConnection编程风格,这将允许我使用我的SQLCeDataReader和他的SQLDataReader.有没有办法做到这一点
我们在Windows Server 2008 R2上运行的Apache Tomcat 7.0.54上运行了一个JSF2.0 Web服务器.我们在运行它的机器上有2个SQL服务器,另一个托管我们的库存软件.我们网页的一部分是对要添加的PartNumbers的验证.在阅读了连接池是与SQL服务器交谈的最佳实践之后,我们创建了一个并使用它来对我们的库存软件进行一些验证.
因为我想要一种方法来检查连接池的运行状况,所以我创建了一个带有ViewScoped辅助bean的测试页面,该辅助bean验证了2个已知的好的部件号.今天是本周第二次出现错误信息"Connection is closed".由于我是新来的conenction池,似乎无法找到任何有关这方面的信息,我感到困惑的是我们没有正确设置.我刚刚重置Apache服务器,它已备份并运行.所以..为了创建我的连接池,我在应用程序的META-INF/context.xml中添加了一些代码.
<Resource type="javax.sql.DataSource"
name="jdbc/FOODB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://Foobar\Inventory;databaseName=FooInventory;user=johnDoe;password=astrongpassword;"
/>
Run Code Online (Sandbox Code Playgroud)
我必须使用ConnectionPool的基本概念是我有一个名为SqlAccessCommand的接口.它或多或少是适配器模式.在我的测试页面中,我使用RunUnsafe方法,以便我可以显示错误消息.所以这是RunUnsafe方法.
protected static DataSource getDataSource() throws NamingException {
Context context = (Context) new InitialContext().lookup("java:/comp/env");
DataSource ds = (DataSource) context.lookup("jdbc/FOODB");
return ds;
}
public static <T> T RunUnsafe(SqlAccessCommand<T> command) throws NamingException, SQLException {
try {
DataSource ds = getDataSource();
try (Connection connection = ds.getConnection();
PreparedStatement statement = connection.prepareStatement(command.getSqlStatement())) {
command.prepareStatment(statement);
try (ResultSet rs = statement.executeQuery()) {
return command.getResults(rs);
}
}
} catch (NamingException | …Run Code Online (Sandbox Code Playgroud) 我在这里读到关于代表和事件(完全不同的原因)来自这个[网站] [1]在那里我得到的印象是,如果你的事件需要足够长的时间,就会生成一个单独的线程.那让我想到了一个我似乎无法解决的错误.所以我正在为我的MSR设备制作键盘楔程序,通过RS232端口进行通信.我创建了这个类来处理输入.
public ComPortInput(SerialPort sp, int delay)
: this(delay)
{
if (sp == null)
throw new System.ArgumentNullException("Serial port can not be null");
serialPort = sp;
}
Run Code Online (Sandbox Code Playgroud)
当我打开这个ComPortInput类时,我订阅了DataReceived事件.如果我正确猜测,那么如果我将延迟设置得足够高,那么我的dataevent将创建一个新线程.我认为通过查看我的代码可以最好地描述问题.
Program.cs中
[STAThread]
static void Main()
{
singleton = new System.Threading.Mutex(true, "Keymon");
if (!singleton.WaitOne(System.TimeSpan.Zero, true))
{ return; }
InstantiateProgram();
System.Windows.Forms.Application.Run(main);
}
private static void InstantiateProgram()
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
main = new frmMain();
}
Run Code Online (Sandbox Code Playgroud)
ComPortInput.cs.只是datareceived事件
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (Delay > 0)
System.Threading.Thread.Sleep(Delay); //waits for all the data to be sent to …Run Code Online (Sandbox Code Playgroud) 使用NServiceBus 4.3我想在出现某些条件时向错误队列发送消息.
场景是当我收到消息时,检查此消息是否指的是我们数据库中的一个或多个项目.如果有多个引用我扔了一个AmbiguousItemException并抓住它.我需要通过电子邮件向负责人提供正确的信息.所有这一切都被弄清楚,但我不希望再次尝试这条消息.相反,我宁愿将其移动到错误Queue,所以当我们收到我们需要的信息时,我们可以添加nullable属性并将消息放回队列进行处理.我已经尝试使用_bus.ForwardCurrentMessageTo("error"),_bus.Send("error", message), _bus.SendLocal(message).最后一个基本上将消息放在无限循环中.代码有点像这样.
public class MoveToErrorQueue
{
private readonly IBus _bus;
public MoveToErrorQueue(IBus bus)
{
_bus = bus;
}
public virtual void Send(ResubmitMessage message)
{
message.Foo= -1;
_bus.Send("error", message);
}
}
Run Code Online (Sandbox Code Playgroud)
以及调用它的代码
try
{
//removed for brevity
}
catch (AmbiguousItemException ex)
{
Log.Error(ex);
sendNotificationCommand.FailureMessage = ex.Message;
_moveToErrorQueue.Send(commandMesage);
}
SendNotification(sendScanningNotificationCommand);
Run Code Online (Sandbox Code Playgroud) 我已经尝试了一段时间,开始努力将我们的自由风格项目转移到管道上.为此,我觉得最好建立一个共享库,因为我们的大多数构建都是一样的.我通读了Jenkins的这篇博客文章.我想出了以下内容
// vars/buildGitWebProject.groovy
def call(body) {
def args= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = args
body()
pipeline {
agent {
node {
label 'master'
customWorkspace "c:\\jenkins_repos\\${args.repositoryName}\\${args.branchName}"
}
}
environment {
REPOSITORY_NAME = "${args.repositoryName}"
BRANCH_NAME = "${args.branchName}"
SOLUTION_NAME = "${args.solutionName}"
}
options {
buildDiscarder(logRotator(numToKeepStr: '3'))
skipStagesAfterUnstable()
timestamps()
}
stages {
stage("checkout") {
steps {
script{
assert REPOSITORY_NAME != null : "repositoryName is null. Please include it in configuration."
assert BRANCH_NAME != null : "branchName is null. Please …Run Code Online (Sandbox Code Playgroud) c# ×8
jenkins ×2
c++ ×1
events ×1
git ×1
java ×1
jenkins-declarative-pipeline ×1
jsf ×1
lambda ×1
linq ×1
marshalling ×1
msbuild ×1
mta ×1
nservicebus ×1
nservicebus4 ×1
performance ×1
pointers ×1
polymorphism ×1
pos-for-.net ×1
safehandle ×1
specflow ×1
sql-server ×1
sta ×1
tomcat ×1