Не мог назвать код c# от vbscript - ошибка ActiveX

Scala: Рекурсивный

  • Должен скомпилировать в то, чтобы быть рекурсивным хвостом. Если!

.

def factorial( value: BigInt ): BigInt = value match {
  case 0 => 1
  case _ => value * factorial( value - 1 )
}
5
задан bluish 22 October 2012 в 14:14
поделиться

4 ответа

Вот простой проект, состоящий всего из нескольких шагов, для начала.

Код C #:

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly:System.CLSCompliant(true)]
[assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b0")]

namespace Cheeso.ComTests
{
    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b1")]
    public class TestReply
    {
        public string salutation;
        public string name;
        public string time;
    }

    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b2")]
    public class TestObj
    {
        // ctor
        public TestObj () {}

        public TestReply SayHello(string addressee)
        {
            return SayHello(addressee, "hello");
        }

        public TestReply SayHello(string addressee, string greeting)
        {
            string x = String.Format("{0}, {1}!", greeting, addressee);
            Console.WriteLine("{0}", x);

            TestReply r = new TestReply
            {
                salutation = greeting,
                name = addressee,
                time = System.DateTime.Now.ToString("u")
            };
            return r;
        }
    }
}

Код клиента VBScript:

Function Main()
    Dim obj
    Dim reply
    set obj = CreateObject("Cheeso.ComTests.TestObj")
    Set reply = obj.SayHello("Evgeny")
    WScript.Echo "Reply at: " & reply.time
    Set reply = obj.SayHello_2("Evgeny", "wassup")
    WScript.Echo "Reply at: " & reply.time
End Function

Main

Для сборки:

(produce your .snk file, once)
csc.exe /t:library /debug+ /keyfile:Foo.snk /out:TestObj.dll TestObj.cs
regasm /codebase TestObj.exe

Затем просто запустите vbscript (через cscript.exe).

Как только вы начнете работать, вы можете настроить его, добавить GAC, сделать typelib явным, добавить явный ProgId и так далее.

ps: К вашему сведению, этот пример показывает, что происходит с перегруженными методами .NET в классе, зарегистрированном для взаимодействия. К имени метода добавлен неявный _2 (_3, _4 и т. Д.).

2
ответ дан 13 December 2019 в 19:29
поделиться

Have you read this article: COM Interop Exposed

In the last page (3) of the article, there's a list:

  1. Define a .NET Interface for the methods you want to expose to COM.
  2. Assign a GUID to that interface with the "Guid" attribute.
  3. Have your class implement your interface as the first interface.
  4. Assign a GUID to that class with the "Guid" attribute.
  5. Add the "ClassInterface(ClassInterfaceType.None)" attribute to prevent regasm/tlbexp from creating an empty default interface.
  6. Hard-code a specific version number in your AssemblyVersion attribute.
  7. Create a strong-name key pair for your assembly and point to it via the AssemblyKeyFile attribute.
  8. Add your assembly to the GAC,
  9. Register your assembly for COM by using the REGASM command along with the "/tlb" option to generate a COM type library.

I'm not sure if the GAC and ClassInterfaceType.None are the missing pieces of your puzzle, you might want to give it a try. Good luck!

4
ответ дан 13 December 2019 в 19:29
поделиться

В вашем коде все в порядке, и вы следовали правильной процедуре установки, судя по ее звуку. Однако полученный код ошибки ясно указывает на то, что интерпретатор сценария не может найти или загрузить сборку. Лучший способ устранить это - использовать утилиту SysInternals ProcMon.

Я без проблем выполнил ваш код, это были самые важные записи в журнале ProcMon:

22  12:04:41.1795038 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC SUCCESS Desired Access: Read
26  12:04:41.1795682 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID   SUCCESS Desired Access: Read
29  12:04:41.1796996 PM WScript.exe 55280   RegQueryValue   HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID\(Default) SUCCESS Type: REG_SZ, Length: 78, Data: {3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}
34  12:04:41.1797653 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}   SUCCESS Desired Access: Read
62  12:04:41.1802539 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32    SUCCESS Desired Access: Read
71  12:04:41.1804181 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\(Default)  SUCCESS Type: REG_SZ, Length: 24, Data: mscoree.dll
824 12:04:41.2425662 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\1.0.0.0\CodeBase   SUCCESS Type: REG_SZ, Length: 124, Data: file:///c:/projects/ClassLibrary2/obj/Debug/ClassLibrary2.DLL
... Lots of .NET keys...
1239    12:04:41.2970169 PM WScript.exe 55280   CreateFile  C:\projects\ClassLibrary2\obj\Debug\ClassLibrary2.dll   SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
4
ответ дан 13 December 2019 в 19:29
поделиться

Возможно, все ваши проблемы вызваны VS. Попробуйте скомпилировать свою библиотеку из командной строки, набрав

csc.exe /t:library AClass.cs /keyfile:Foo.snk - produce your key file with VS!
regasm /codebase /tlb AClass.dll

VS добавляет что-то вроде / warn: / noconfig и так далее, а также добавляет ссылки на другие сборки, такие как System.Core и так далее, и иногда вызывает ошибки . Для меня работала компиляция из csc.

0
ответ дан 13 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: