我已经开始研究大型打字稿项目了.
从一开始,我就想保持我的文件有条理(这个项目将在许多开发人员之间进行分配,因此订单非常必要).
我一直在尝试使用模块/命名空间并将类拆分为每个文件的单独文件,其中包含一个包含命名空间的文件夹.
文件结构是:
app.ts
\Classes
---- \Animals
---- ---- Mammals.ts
---- ---- Reptiles.ts
Run Code Online (Sandbox Code Playgroud)
然后,我尝试使用以下内容导入app.ts中该命名空间中的所有文件: import * as Animals from "./Classes/Animals"
至于命名空间文件本身,我尝试了以下方法,但没有成功:
namespace Animals {
export class Mammals {
constructor() {
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且:
module Animals {
export class Reptiles {
constructor() {
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,路径永远不会被识别(因为它指向文件夹而不是单个文件).这甚至可能吗?将来自单个命名空间的所有类放在一个文件中将导致文件长达数千行,并且该项目不可维护.
我还注意到TypeScript 1.5支持tsconfig.json - 但是,必须手动将每个文件添加到地图中是开发人员开始添加类时引入问题的可靠方法.
注意:我正在使用Visual Studio 2015,TypeScript 1.5(我相信,不知道如何验证).我也启用了ES6支持.
我有一个HTML元素,里面只有可见文本.这个例子是一个<div>
元件,但也可以是一个<span>
,<p>
或其他DOM元素.
<div>This is a simple example.</div>
Run Code Online (Sandbox Code Playgroud)
单击时,我可以获得光标在div表面上的位置,但是我需要在单击时确定最近的字符和/或其索引在div.innerHTML字符串中的位置.
我在这里的 SVG文本实体的"getCharNumAtPosition"方法中找到了类似的实现.
是否可以在JavaScript中使用HTML实现这样的功能?
(如果解决方案可以在大多数现代浏览器中移植,使用大多数书面语言,并且基于相对稳定的标准,以便以后不会出现问题,那么解决方案将非常有用.)
我注意到使用VS 2013在.Net 4.0中的32位和64位下编译控制台应用程序时GC的行为不一致.
请考虑以下代码:
class Test
{
public static bool finalized = false;
~Test()
{
finalized = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在Main()
......
var t = new Test();
t = null;
GC.Collect();
GC.WaitForPendingFinalizers();
if (!Test.finalized)
throw new Exception("oops!");
Run Code Online (Sandbox Code Playgroud)
在64位(调试)模式下运行时,每次都可以正常工作; 但是,在32位模式下运行我无法强制收集此对象(即使我创建了更多对象并等待一段时间,我已经尝试过).
有没有人对这是为什么有任何想法?在尝试调试一些必须处理为32位版本的程序集释放非托管代理数据的代码时,这会给我带来麻烦.在32位模式下有很多对象只是坐在那里很久以后(在64位中不是这样).
我正在尝试在32位模式下调试某些东西,但终结器不会被调用(至少不是强制调用).对象只是坐在那里永远不会被收集(我可以看到所有弱引用仍然有一个值).在64位模式下,所有弱引用都按预期清除,并且所有终结器都被调用.
注意:虽然上面的代码规模非常小,但我注意到在32位模式下,GC中有更多的对象,直到稍后创建更多对象(即使调用"Collect"和"WaitForPendingFinalizers").在64位模式下绝不是这种情况.我有一个用户想知道为什么这么多对象没有被收集,这导致我调查,我发现一切似乎在64位模式比32更好.只是试图理解为什么.
编辑:这是更好的代码来显示差异:
class Program
{
class Test
{
public static bool Finalized = false;
public int ID;
public Test(int id)
{
ID = id;
}
~Test()
{ // <= Put breakpoint here
Finalized = …
Run Code Online (Sandbox Code Playgroud) 出于某种原因,我有这个奇怪的错误:
"不匹配的匿名define()模块:function(){"use strict"; return ax} http://requirejs.org/docs/errors.html#mismatch "
设置了一些JS断点后,我在这里找到了错误源:
a [browserlink] Line 363:
/*! aXe v2.0.5
* Copyright (c) 2016 Deque Systems, Inc.
* ...etc... */
...etc...&&define([],function(){"use strict";return axe}),...etc...
Run Code Online (Sandbox Code Playgroud)
因此,实现它是在动态生成的"browserlink"代码中,我在Visual Studio中禁用了"browserlink",问题就消失了(一切都很完美,没有问题).它似乎function(){"use strict";return axe}
陷入了requirejs队列?('defQueue')首次启动Web应用程序时会发生这种情况,但是没有错误YET.只有在我执行使用requirejs的操作时才会发生错误.经过一些分析,我发现这个函数在requirejs中:
//Grab defines waiting in the global queue.
intakeDefines();
Run Code Online (Sandbox Code Playgroud)
在这里失败:
while (defQueue.length) {
args = defQueue.shift();
if (args[0] === null) {
return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));
Run Code Online (Sandbox Code Playgroud)
其中args == [null,[],"function(){"use strict"; return ax}"]
问题是,任何人都可以帮我弄清楚为什么会出现这种冲突吗?这是VS browserlink的某种错误吗?
我希望能够为readonly
班级用户创建属性(而不是获取器),但是我需要在内部对其进行更新。有没有办法做到这一点并允许在内部进行更改?(并确保TypeScript阻止大多数更改该值的尝试)
(就我而言,这是一个游戏引擎,getters / setters(一般功能)是一个糟糕的选择)
好的,这是有效的:
[StructLayout(LayoutKind.Explicit, Size = 28)]
public unsafe struct HandleProxy
{
[FieldOffset(0), MarshalAs(UnmanagedType.I4)]
public JSValueType _ValueType; // JSValueType is an enum
[FieldOffset(4), MarshalAs(UnmanagedType.I4)]
public Int32 _ManagedObjectID;
[FieldOffset(8)]
public void* _NativeEngineProxy;
[FieldOffset(16), MarshalAs(UnmanagedType.I4)]
public Int32 _EngineID;
[FieldOffset(20)]
public void* _Handle;
}
[DllImport("Proxy")]
public static extern void DisposeHandleProxy(HandleProxy* handle);
Run Code Online (Sandbox Code Playgroud)
......这不......
[StructLayout(LayoutKind.Explicit, Size = 20)]
public unsafe struct ValueProxy
{
[FieldOffset(0), MarshalAs(UnmanagedType.I4)]
public JSValueType _ValueType; // 32-bit type value.
[FieldOffset(4), MarshalAs(UnmanagedType.Bool)]
public bool _Boolean;
[FieldOffset(4), MarshalAs(UnmanagedType.I4)]
public Int32 _Integer;
[FieldOffset(4)]
public double _Number;
[FieldOffset(12)] …
Run Code Online (Sandbox Code Playgroud) 我有一个名为的方法GetJSONResponse(...)
,这是一个提取:
var response = new HttpResponseMessage(httpResponseCode)
{
Content = objectToSerialize != null ?
new ObjectContent(objectToSerialize.GetType(), objectToSerialize, new JsonMediaTypeFormatter(), JsonMediaTypeFormatter.DefaultMediaType.MediaType)
: null
};
Run Code Online (Sandbox Code Playgroud)
一切都运行良好,直到调用此方法,然后我在输入方法之前得到此错误(可能ASP.NET根据需要编译方法?):
找不到方法:'System.Net.Http.Headers.MediaTypeHeaderValue System.Net.Http.Formatting.JsonMediaTypeFormatter.get_DefaultMediaType()'.
最初我认为web.config文件(对于视图)缺少名称空间,我试图添加,但它没有解决任何问题 - 然后我意识到我实际上是通过WebAPI控制器调用它'获取'方法(不是观点).所需的DLL存在(复制到本地是真的),但这似乎仍然失败.很明显,错误意味着无法找到方法,但它编译并启动正常,因为c#文件正确引用了类型而没有问题......任何想法?
提问这个问题有点奇怪,因为我的代码似乎不应该起作用,但确实如此,虽然我没有抱怨,但我想确认原因?大声笑
简单地说,我有一个C++本机DLL(根本没有CLR /托管支持),它接受来自C#代码的回调.本机端存储stdcall回调函数,该函数由C#端提供.我一直认为回调METHOD(在C#中)必须是静态的,但是非静态和lambda表达式两种工作都很简单!?"this"指针是如何从本机代码编组的?我一直以为本机代码只存储非实例函数指针?
现在,我确实找到了一篇文章,其中一些人发出了IL代码,以便在本地和非静态托管回调之间"桥接".我还注意到了这种折旧的方法:"Marshal.GetUnmanagedThunkForManagedMethodPtr()".不再支持该方法,我假设它意味着它是内置的?
问题摘要:
现在通过发送IL代码将thunking本地构建到.NET中吗?如果是这样,在什么版本的.NET中,这会被本机支持?
Mono也支持隐含的"thunking"吗?
当为托管回调发出IL时,当thunk引用的实例被删除时会发生什么?是否删除了IL,或者这可能会导致内存"泄漏"?
谢谢.
好的,我在结构中有以下代码(有充分的理由,所以不要争论)来支持动态属性,但实际属性和方法存在于外部动态对象中(由结构值指向):
public DynamicMetaObject GetMetaObject(Expression parameter)
{
IDynamicMetaObjectProvider dynObj = ManagedObject ?? Engine.CreateObject<V8NativeObject>(this);
return new DynamicMetaObject(Expression.Parameter(((ParameterExpression)parameter).Type, ((ParameterExpression)parameter).Name),
BindingRestrictions.Empty, dynObj);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,并给出以下错误:“IDynamicMetaObjectProvider V8.Net.InternalHandle 创建了无效的 DynamicMetaObject 实例。”
如果可能的话,我试图避免必须扩展“DynamicMetaObject”来构建与“dynObj”的桥梁,因为“dynObj”已经是动态的,并且已经有自己的“GetMetaObject()”方法。我知道“参数”表达式代表当前目标,但是有没有办法将其传递到外部对象(“dynObj”)的“GetMetaObject()”方法中,而不创建另一个对象作为桥梁?
仅供参考:还有另一个类似的问题,有同样的错误,但我试图尽可能地限制创建的对象数量(即试图防止用桥接对象污染 GC)。
ASP.NET Core 管道是否通过多线程处理请求?如果是,您如何配置线程数?而且,单例服务是否应该是线程安全的?
c# ×6
javascript ×3
typescript ×2
.net ×1
.net-4.0 ×1
.net-4.5 ×1
asp.net ×1
asp.net-core ×1
browser-link ×1
c++ ×1
callback ×1
character ×1
dynamic ×1
finalizer ×1
marshalling ×1
position ×1
struct ×1
thunk ×1