#c# #javascript #.net #webbrowser-control #com-interop
#c# #javascript #.net #веб-браузер-управление #совместное взаимодействие
Вопрос:
Я могу вызывать методы C # WebBrowser.ObjectForScripting
с помощью javascript window.external
из WebBrowser
элемента управления WinForms и передавать string
, int
, bool
и т.д. Однако я не знаю, как передать объект javascript Date
и каким-то образом преобразовать / маршалировать его в .Класс NET DateTime
.
Очевидно, что я мог бы передать string
и проанализировать его, но на самом деле это не главное. Мне просто любопытно, как я мог бы сделать это с помощью javascript Date
и .NET DateTime
?
Ответ №1:
Вы можете воспользоваться тем фактом, что даты в Javascript выражаются как количество миллисекунд, прошедших с эпохи UNIX (1970-01-01 00:00:00 UTC). Используйте метод valueOf() для получения этого значения из Date
объекта :
var millisecondsSinceEpoch = yourDate.valueOf();
Если вы можете присвоить это значение C # в качестве double
, вы можете создать соответствующий DateTime
объект, используя его конструктор и метод AddMilliseconds():
DateTime yourDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
.AddMilliseconds(millisecondsSinceEpoch);
Комментарии:
1. Я мог бы это сделать, но я ищу только решение о том, как прочитать
Date
объект javascript в C #. Я даже не уверен, возможно ли это, но если это не так, все в порядке. Но я надеюсь, что есть какой-то способ сделать это.2. В C нет «объектов даты Javascript»#
3. Насколько я понимаю, когда я передаю
Date
объект в C #, он маршалируется с помощью COM, поэтому я полагаю, что это возможно сделать.
Ответ №2:
Наконец-то у меня это заработало. Я не знаю почему, но я не могу использовать его с dynamic
. Вот решение:
[ComVisible(true)]
public class Foo
{
public void Bar(object o)
{
var dateTime = (DateTime)o.GetType().InvokeMember("getVarDate", BindingFlags.InvokeMethod, null, o, null);
Console.WriteLine(dateTime);
}
}
Ответ №3:
Я нашел лучшее решение для своего проекта.
в javascript:
var date = new Date();
myComObject.DoSomething(date.getVarDate());
в C#
[ComVisible(true)]
public class Foo
{
public void Bar(DateTime dateTime)
{
Console.WriteLine(dateTime);
}
}
Комментарии:
1. Конечно, это возможно, но мне было интересно, как это сделать без вызова
getVarDate
в javascript.