2014-01-03 1 views
0

Я проверил stackoverflow (и то, что похоже на всюду). Я хотел бы получить работу COM решение, так что JScript файл может быть записан в видеПолучение библиотеки CX ActiveX/COM для работы через JScript

var T = new ActiveXObject("MySimulator.World"); 
T.MyMethod(); 

Он будет выполнен в командной строке с помощью

cscript mytest.js 

В этом случае, я получаю сообщение об ошибке " Сервер автоматизации не может создать объект ».

В C#, я следовал различные предложения, с последним интерфейсом существа:

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83B")] 
public interface IComMyReaderInterface 
{ 
    void MyFunction(); 
} 

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None), Guid("0D53A3E8-E51A-49C7-944E-E72A2064F9DD"), ProgId("MySimulator.World")] 
[ComDefaultInterface(typeof(IComMyReaderInterface))] 
public class MyReader : IComMyReaderInterface 
{ 
    public MyReader() 
    { 
     ... 
    } 

    public void MyFunction() 
    { 
     ... 
    } 
... 
} 

Спасибо и просто дайте мне знать, если требуется дополнительная информация.

+0

Несколько шагов, чтобы получить эту работу, они уже хорошо освещены в других вопросах. Однако никто не назвал это совершенно неправильным. Предполагая, что имя пространства имен на самом деле является MySimulator, ProgID - это «MySimulator.MyReader», а метод вызова - MyFunction, а не MyMethod. –

+0

Ханс - спасибо за то, что посмотрели. Раньше у меня было это правильно - пробовать разные вещи. Изменение его обратно на MySimulator.MyReader не исправляет его. Я посмотрел и попробовал дюжину потенциальных решений, но пока ничего не работает. Мне интересно, что является ключевым/критическим, так что jscript увидит его так, чтобы объект создавался через jscript? Еще раз спасибо. – Buck

ответ

2

Я бы предположил следующее. Ваша среда разработки, вероятно, является 64-разрядной ОС, и ваш проект C# DLL, вероятно, сконфигурирован для компиляции с Any CPU в качестве платформы Target. Читайте дальше, если это так.

Выберите либо x86, либо x64 и скомпилируйте проект. Если вы идете с x86, затем зарегистрировать сборку с 32-разрядной версией regasm.exe:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase assembly.dll

Затем запустить тест на JavaScript с 32-разрядной версией cscript.exe:

C:\Windows\SysWOW64\cscript.exe mytest.js

Если вы идете с x64, это было бы:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase assembly.dll C:\Windows\System32\cscript.exe mytest.js

[EDITED] Следующий код проверен для работы с использованием вышеуказанных инструкций.

C#

using System; 
using System.Runtime.InteropServices; 

namespace ComLibrary 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual), 
     Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83B")] 
    public interface IComMyReaderInterface 
    { 
     void MyFunction(); 
    } 

    [ComVisible(true)] 
    [ClassInterface(ClassInterfaceType.None), 
     Guid("0D53A3E8-E51A-49C7-944E-E72A2064F9DD"), 
     ProgId("MySimulator.World")] 
    [ComDefaultInterface(typeof(IComMyReaderInterface))] 
    public class MyReader : IComMyReaderInterface 
    { 
     public MyReader() 
     { 
     } 

     public void MyFunction() 
     { 
      Console.WriteLine("MyFunction called"); 
     } 
    } 
} 

JavaScript (mytest.js):

var T = new ActiveXObject("MySimulator.World"); 
T.MyFunction(); 

Выход:

MyFunction called

+1

Отлично! Спасибо, что освободил меня. – Buck