Могу ли я сделать доступными только некоторые C# классов? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть проект библиотеки C#, который предназначен для использования из неуправляемого кода C ++ через COM. enter image description here

Таким образом будут вызываться только 2 или 3 метода, но я получаю такие предупреждения:

предупреждение: предупреждение экспортера библиотеки типов обработка ''. Предупреждение. Экспортер библиотеки типов обнаружил в сигнатуре общий экземпляр типа c. Код Generi c нельзя экспортировать в COM.

Эти свойства и методы не предназначены для доступа из C ++, на самом деле они даже не public методы, поэтому они (конечно) все равно не будет видно.

На самом деле два вопроса:

  • Q1: Как я могу контролировать, что экспортируется? Модификаторы доступа к классам / методам или что-то еще?
  • Q2: Как я могу увидеть, что экспортируется, например, проверьте, что находится в библиотеке типов, чтобы узнать, пропустил ли я что-то

Было бы неплохо перепроверить, что я не забиваю свою библиотеку типов множеством вещей, которых там быть не должно ...

1 Ответ

1 голос
/ 18 июня 2020

Я могу объявить всю сборку невидимой для COM, вот так (на самом деле, когда вы используете шаблон библиотеки классов Visual Studio C#, он сам должен помещать его в AssemblyInfo.cs):

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

Теперь в каждом классе я могу решить, будет ли он виден COM или нет, как здесь:

using System;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    [ProgId("MyCoolClass")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class MyCoolVisibleClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello COM world");
        }

        // explicit non COM visible because it's set to true at class level
        [ComVisible(false)]
        public void SayHello2()
        {
            Console.WriteLine("Hello world");
        }
    }

    // implicit non COM visible
    public class MyCoolInvisibleClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello world");
        }
    }
}

Вы можете использовать свойства проекта для регистрации (флажок «Зарегистрироваться для COM-взаимодействия»), но лично я зарегистрируйтесь с помощью такой командной строки (для мира 64-битного реестра):

%windir%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary1.dll /codebase /tlb

Это выводит примерно так:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary1.dll /codebase /tlb
Microsoft .NET Framework Assembly Registration Utility version 4.8.3752.0
for Microsoft .NET Framework version 4.8.3752.0
Copyright (C) Microsoft Corporation.  All rights reserved.

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
Assembly exported to 'D:\KilroyWasHere\ClassLibrary1.tlb', and the type library was registered successfully

И я могу проверить, что на самом деле находится внутри. tlb с использованием OleView из Windows SDK :

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...