我想知道在Delphi中是否可以直接从逻辑磁盘驱动器设备"C:\"读取CD作为原始流.
如果我已经有一个有效的文件句柄,我希望我可以使用TFileStream.
我正在尝试解决System.Classes.pas中一个已知的丑陋性能限制,它具有20世纪80年代的常量缓冲区限制($ F000),如下所示:
function TStream.CopyFrom(const Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
....
Run Code Online (Sandbox Code Playgroud)
这导致我们的Delphi应用程序遭受重大性能损失.在delphi XE2到XE5中,我们能够修改它并使用以下方法之一:
我可以修改Delphi源代码,然后通过从批处理文件调用dcc32.exe,重建Delphi库文件夹中的System.Classes.dcu文件.我意识到这很难看,我不喜欢这样做,但我不喜欢RTL中这个丑陋的性能问题,而且我们的用户无法忍受它带来的性能问题.
我可以尝试在我的项目搜索路径中的某处放置一个经过修改的system.classes.pas文件.
现在,在Delphi XE6中,上述两种方法都不适合我,这可能要归功于一些内部编译器的更改.我在其uses子句中包含System.Contnrs的最小命令行应用程序中得到的错误是:
[dcc32 Fatal Error] System.Classes.pas(19600): F2051 Unit System.Contnrs was compiled with a different version of System.Classes.TComponent
Run Code Online (Sandbox Code Playgroud)
重现此问题的示例程序(假设您已修改了System.Classes.pas并更改了MaxBufSize常量),如下所示:
program consoletestproject;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Contnrs,
System.SysUtils;
var
List:System.Contnrs.TObjectList;
begin
WriteLn('Hello world');
end.
Run Code Online (Sandbox Code Playgroud)
同样,这个问题在Delphi XE6中很容易重现,但在XE5或更早版本中不是问题.
当您绝对必须使用System.Classes.pas或System.SysUtils.pas或其他一些非常低级别单元的修改副本解决基本RTL或VCL限制时,建议的做法是什么?(是的,我知道如果你不必这样做,你就不应该这样做,不要为讲课而烦恼.)
是否有一组神奇的命令行参数可以通过命令行中的"dcc32.exe"使用,以生成一个修改后的DCU,它将与上面的应用程序示例正确链接?
作为第二个问题,是否有.dcu文件没有源存在,当一个人尝试这样做时会破坏,在这种情况下,上述所有的答案是,"你无法解决这个问题,如果有一个bug在RTL中,你运气不好"?
一种可能的解决方法是在项目搜索路径(或库路径)中包含"$(BDS)\ source\rtl\common",强制每个损坏的(需要重新编译)DCU重建每个时间,但这看起来很丑陋和错误.
有谁知道如何在.NET Core中获取有关当前环境和平台的信息?目前Core库中没有Environment类.

这是关于.net核心的过时预发布版本.
我已经使用visual studio 2015的beta /预览创建了预发布ASP.Net 5(后来改名为asp.net core)的基本项目,我已将项目发布到文件系统并尝试运行它从那里使用命令
dnx . web
Run Code Online (Sandbox Code Playgroud)
结果的错误是"无法解决项目".我已经检查过dnvm正在使用默认框架.我发布的目录包含web,web.cmd,wwwroot和approot文件夹.还有什么我应该检查的吗?
我正在使用:asp.net core 1.0.0-beta4 clr
在本博文中所示的实体框架6中,有一种方法可以配置一个拦截器,它可以记录所有慢速查询,包括堆栈回溯.
2015年的一个问题是关于之前称为EF7的测试版的早期测试结果,这表明在asp.net vnext早期测试版中它还不可能.
然而,EF Core的整个设计是可组合的,并且在这里讨论github bug跟踪器时,你可能有一种技术可以将一些低级类子类化SqlServerConnection,然后在那里覆盖一些方法,以获得一些你可以挂钩的点在执行查询之前和之后,如果执行了毫秒计时器值,则添加一些低级别日志记录.
这仍然是必要的,也是EF Core 1.0.0-rc2-final中的唯一技术(目前截至2016年6月)?
在dotnet core 2.0控制台应用程序中,输出:
Console.WriteLine("Hello World from "+ System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription);
Run Code Online (Sandbox Code Playgroud)
是一个意想不到的价值:
Hello World from .NET Core 4.6.00001.0
Run Code Online (Sandbox Code Playgroud)
有没有办法以编程方式检测.net core 2.0或更高版本,而不是2.0之前的.net核心平台?我意识到在大多数情况下你可能不应该这样做.但是在你确实需要这样做的奇怪情况下,你会怎么做?
我想将一个大的64位值从十进制或十六进制字符串转换为64位UINT64数据类型.有一个UIntToStr可以帮助将UINT64转换为字符串,但没有办法将64位整数转换为无符号值,作为字符串.这意味着使用RTL不能用十进制或十六进制表示大于2**63的整数值.这通常不是什么大问题,但是可能发生用户需要输入一个值,作为无符号整数,必须作为64位无符号整数值存储到注册表中.
procedure HandleLargeHexValue;
var
x:UINT64;
begin
x := $FFFFFFFFFFFFFFFE;
try
x := StrToInt('$FFFFFFFFFFFFFFFF'); // range error.
except
x := $FFFFFFFFFFFFFFFD;
end;
Caption := UintToStr(x);
end;
Run Code Online (Sandbox Code Playgroud)
Update Val现在可以在Delphi XE4及更高版本中正常运行.在XE3及以下Val('$ FFFFFFFFFFFFFFFF')有效,但不是Val('9223372036854775899').正如Roeland在Quality Central 108740中指出的那样:在Delphi XE4之前,System.Val在十进制中存在大的UInt64值问题.
我在visual studio中构建了世界上最笨拙,最简单的SOAP服务器,大约3次点击.Visual Studio 2010中的确切步骤:首先将新项目创建为Web应用程序,然后添加Web服务类型的新项目.(有关图片,请参阅此处接受的答案.)soap服务器服务Service1有一个简单的方法GetData:
来自clientService1.pas的片段,使用WSDL导入器创建...
IService1 = interface(IInvokable)
['{967498E8-4F67-AAA5-A38F-F74D8C7E346A}']
function GetData(const value: Integer): string; stdcall;
function GetDataUsingDataContract(const composite: CompositeType2): CompositeType2; stdcall;
end;
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此方法时,如下所示:
procedure TForm3.Button1Click(Sender: TObject);
var
rio : THTTPRIO;
sv:IService1;
addr : string;
data : string;
begin
//addr := '....'; // url from visual studio 2010 live debug instance.
rio := THTTPRIO.Create(nil);
sv := GetIService1( true, addr, rio );
try
data := sv.GetData( 0);
Button1.Caption := data;
finally
sv := nil;
rio.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是这样的:
ESOAPHTTPException:
The …Run Code Online (Sandbox Code Playgroud) 我有一个很大的代码库,我正在使用它有这样的单位:
unit myformunit;
interface
type
TMyForm = class(Form)
end;
procedure not_a_method1;
procedure not_a_method2;
var
global1,global2,global3:Integer;
...
Run Code Online (Sandbox Code Playgroud)
简而言之,代码的作者没有编写方法,他们编写了全局程序.有成千上万的人.在这些过程中,它们引用了单个实例MyForm:TMyForm.
我正在考虑编写一个解析器/重写器实用程序,它将把这个代码变成"至少是面向对象的代码".策略是将接口和实现部分全局变为表单,作为开始.我意识到这不是优雅的OOP.但这是全球化的一步.
如果我一次可以在一个单元上执行此操作,我可能能够修复项目其余部分的破损,如果我一次只能在一个表单上执行此操作.但我想,以减少而不是做手工的时候需要重写单位的金额.有些表单有500多个过程和500多个接口和实现全局变量,实际上,这些变量特定于它们与同一单元中的单个表单实例的状态.
基本上,如果没有这样的话,我会做的就是编写一个基于Castalia Delphi解析器的解析器.我希望也许ModelMakerCodeExplorer,或者castalia,或其他类似的工具有一些东西至少可以做我需要的一部分,所以我不必自己构建这个实用程序.即使我必须建立它自己,我估计它可能会自动大约有一千至2000小时咕噜工作的我.我至少可以运行它,然后看看有多少中断,然后在我决定重构这段代码的努力之后还原或提交.
实现相同目标的替代策略(从零封装和零OOP,到更多封装,稍微超过零OOP,以增量方式,在大型非结构化delphi代码库上,仅在不可避免的情况下使用对象,并且永远不会对真正的OOP有任何想法,欢迎.
所以他们改变了他们在asp.net 5 rc1和rc2之间引导web应用程序的方式.
它曾经是:
public static void Main(string[] args) => WebApplication.Run<Startup>(args);
Run Code Online (Sandbox Code Playgroud)
但在RC2中,我不再引用静态类WebApplication.有任何想法吗?
delphi ×5
c# ×3
.net-core ×2
asp.net ×2
delphi-xe ×2
.net ×1
asp.net-core ×1
cd ×1
delphi-xe6 ×1
dnvm ×1
dnx ×1
oop ×1
refactoring ×1
soap ×1