Передача объекта даты javascript в веб-браузер C # с помощью window.external

#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.