我们计划使用C#和MySQL开发客户端服务器应用程序.我们计划像任何其他软件实用程序一样在货架上销售产品.我们担心我们的产品反编译在可用性和捆绑功能方面确实比竞争对手有一些优势.
我们如何防止我们的软件反编译,因此产品的业务逻辑仍然完好无损?
我们听说过Reflector和其他反编译器,它们使我们的代码非常容易被复制.
我们的客户群不是公司,而是医生,他们自己可能不会这样做,但我们的竞争对手可能想要复制/禁用许可,甚至复制代码/功能,以便我们的产品价值在市场上下降.
任何阻止这种情况的建议都是受欢迎的.
在读取其中的文件时,同一台机器的同一用户间歇性地发生此异常%LOCALAPPDATA%.
研究
我已经检查了这个标题目前提供的所有可能的重复项(有很多).有一个与读取没有答案的AES加密文件有关; 我不相信,因为这些文件没有加密.
其中大部分与写入文件有关(但我正在读取文件),或者是MSDN上为File.ReadAllBytes(字符串)记录的明显原因.
这个例外的三个解释是:
File.Exists,所以我想我可以排除这一点.脚本
当以域用户身份运行的应用程序正在读取%LOCALAPPDATA%同一用户的子文件夹内的文件时,会发生这种情况(对于该用户来说,应该没有权限问题来读取文件).其中的子文件夹只遵循正常的"CompanyName"\"ApplicationName"结构,并且没有对子文件夹应用其他权限(我们只是使用该文件夹来保持我们的文件远离其他人).
例外
System.UnauthorizedAccessException:拒绝访问路径' [redacted] '.在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs) ,System msgPath,Boolean bFromProxy,Boolean useLongPath,Boolean checkHost)at System.IO.FileStream..ctor(String path,FileMode mode,FileAccess access,FileShare share,Int32 bufferSize,FileOptions options,String msgPath,Boolean bFromProxy,Boolean useLongPath,布尔checkHost)在System.IO.File.InternalReadAllBytes(字符串路径,布尔checkHost)
在下面的代码
码
// Note that filename is within %LOCALAPPDATA%
if (File.Exists(fileName))
{
var readAllBytes = …Run Code Online (Sandbox Code Playgroud) 这有点难以解释我真正想要的东西(更好的标题建议得到赞赏,以便人们可以在将来轻松找到它).
假设我有这个:
{
{
$myTagThing$
}
}
Run Code Online (Sandbox Code Playgroud)
我想要匹配
{
$myTagThing$
}
Run Code Online (Sandbox Code Playgroud)
即匹配一切从过去{之前$myTagThing$,直到第一个}之后$myTagThing$.
所以我认为我需要这个\{.*\$myTagThing\$.*\},但它也会匹配字符串中的第一个{和最后一个}(即整个例子).然后我尝试使用前瞻和后视(均为负面)\{(.*(?!\{))\$myTagThing\$.*(?<!\})\}(https://regex101.com/r/RfdHUH/1/).但这仍然行不通.
我的理论是,我可能正在使用前瞻和错误的方式,因为这是我第一次使用它们.
有任何想法吗?
编辑:标志是\gms.
类似于问题如何让 Dapper 将 .net DateTime 映射到 DateTime2;但我希望事后能够将其重新设置回来。
该问题当前接受的答案涉及更改 Dapper 源文件;但我正在使用 NuGet 包,所以这对我不起作用。正如对已接受答案的第一条评论所指出的,这是不可逆的 - “如果有些是 DateTime 而另一些是 DateTime2 怎么办?” - 这就是我的场景:不同的查询需要不同的映射(每个查询只需要其中之一)。
我正在使用同一问题的得票较高的答案。然而,这种做法似乎也是不可逆转的。似乎第一个查询完成时设置的任何值都会保留,并且此后不可更改。
以下代码是 MCVE。如果运行它,您会看到类型始终显示为“datetime”,并且值的精度永远不会超过毫秒(正如您对日期时间的期望);尽管尝试改变映射。然后,您必须注释掉对“PerformDapperQuery()”的第一次调用,然后再次运行它:您现在将看到该类型始终返回为“datetime2”,并且这些值在秒的小数部分上具有完整的 7 位精度(正如您对 datetime2 的期望)。
public static void Main()
{
// I know this is marked as obsolete, and I am open to suggestions for alternatives.
// see https://github.com/StackExchange/Dapper/issues/798
#pragma warning disable 618
var oldValue = SqlMapper.LookupDbType(typeof(DateTime), null, false, out var handler);
#pragma warning restore 618
PerformDapperQuery();
SqlMapper.AddTypeMap(typeof(DateTime), …Run Code Online (Sandbox Code Playgroud) 说我有这样的功能.我需要知道将加起来为N的1和2的所有组合.有没有更好的方法来编写这个对于大整数(如N = 1200或12000)表现更好的方法?
public static int Combos(int n)
{
if (n < 3)
{
return n;
}
else
{
return Combos(n - 1) + Combos(n - 2);
}
}
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×1
algorithm ×1
dapper ×1
datetime ×1
datetime2 ×1
decompiling ×1
licensing ×1
obfuscation ×1
regex ×1
sql-server ×1
windows ×1