.NET COM Interop на Windows 7 64Bit вызывает у меня головную боль - PullRequest
6 голосов
/ 01 мая 2010

.NET COM взаимодействие до сих пор всегда работало довольно хорошо. После обновления до Windows 7 мои COM-объекты .NET больше не работают.

Мой COM-объект так же прост, как:


namespace Crap
{
    [ComVisible(true)]
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyClass : IMyClass
    {

        public MyClass()
        {}

        public void Test()
        {
            MessageBox.Show("Finally got in here.");
        }

    }
}



namespace Crap
{
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")]
    public interface IMyClass
    {

    }
}


сборка также помечена как ComVisible.

Я регистрирую сборку, используя

regasm /codebase /tlb "path"

успешно регистрируется (режим администратора). Я пробовал регазм 32 и 64 бит. Оба раза я получаю ошибку

«Компонент ActiveX не может создать объект Crap.MyClass» с использованием этого vbscript:


dim objReg
Set objReg = CreateObject("Crap.MyClass")
MsgBox typename(objReg)

fuslogvw также не дает мне никаких подсказок. Этот COM-объект отлично работает на моей машине с Vista 32 Bit.

Я не понимаю, почему я не смог найти решение этой проблемы в Google ... я действительно единственный человек, который когда-либо сталкивался с этой проблемой?

Глядя на OleView, я вижу, что мой объект успешно зарегистрирован. Я могу создавать и другие COM-объекты ... это не работает только с моими собственными.

Спасибо, Kevin

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Я не человек C #, но вот пример, который я конвертировал из VB.net. Обратите внимание, я должен был убедиться, что у меня было одно пространство имен на уровне проекта, а затем этот класс в проектах VB. Я понимаю, что в C # Projects все иначе.

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass {

    // These  GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class.
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba";
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51";
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f";

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject.
    public SalePayStatus() : base()
    {
    }
}

Если меня беспокоит COM, я всегда сначала проверяю реестр, чтобы убедиться, что соответствующие записи созданы. Я обнаружил, что управление версиями и установкой MSI вызывает проблемы, особенно удаление (не очищает реестр) или переустановку, а MSI с COM-объектами .net, который перезаписывает существующую запись COM, вызывает все виды неприятностей.

Обычно я обнаруживаю, что вам нужно быть осторожным с библиотеками .net x64 vs x32 build. Например, вам, возможно, придется явно ссылаться на C: \ Windows \ SysWow64 \ или C: \ Windows \ System32 \ editions механизма VBS.

Наконец, если вы используете VBS на веб-сайте ASP на сервере x64 с компонентом COM .net x32, вам необходимо убедиться, что расширенный параметр пула приложений IIS 7 «32-битное приложение» правильно установлен на значение «Истина / Ложь».

1 голос
/ 01 мая 2010

Спасибо! Не знал, что есть 2 реестра, о которых я должен позаботиться ... было время перейти на 64-битную Win7, я думаю:)

Спасибо.

Для всех, кто сталкивается с той же проблемой: wscript (клиент, который обычно выполняет файлы vbs) выполняется в 64-битном режиме => RegAsm 64bit должен использоваться

Другие распространенные клиенты, такие как Excel, выполняются в 32-битном режиме => 32-битный RegAsm должен использоваться.

Visual Studio выполняется в 32-битном => Регистр для взаимодействия COM регистрирует только COM-объект в 32-битном реестре.

Единственное, что мне теперь нужно выяснить, это как убедиться, что VS Setup регистрирует обе версии

...