Ссылка Enum в другом проекте - PullRequest
1 голос
/ 14 марта 2012

У меня есть следующий код в project1, который вызывает класс из project2.

Project1 вызывает: ConvertDocument.Convert (CommandLineFile, "d: \ testing \ test.pdf", WdSaveFormat.wdFormatPDF );

Проект 2 содержит ConvertDocument, а WdSaveFormat из Microsoft.Office.Interop.Word, на который есть ссылка в проекте 2.

Когда я пытаюсь передать значение enum в project2 с помощью приведенного выше кода, это дает мне:

Невозможно разрешить символ "WdSaveFormat".

У меня вопрос, могу ли я ссылаться на это перечисление в project2, которое ссылается на Microsoft.Office.Interop.Word из Project1, без добавления ссылки?

Надеюсь, это имеет смысл ...

Еще раз спасибо!

Ответы [ 6 ]

3 голосов
/ 14 марта 2012

Нет, проекту 1 потребуется ссылка на Microsoft.Office.Interop.Word.

Единственный способ избежать этого - заставить Project 2 принять объект (или в этом случае int будет лучше), а не WdSaveFormat. (Изменить: или, как отмечают другие комментаторы, Project 2 может определить свой собственный enum, который отображается обратно в WdSaveFormat). Project 2 может затем привести int к перечислению WdSaveFormat.

Например:

void Convert(string in, string out, int saveFormat)
{
    WdSaveFormat wdSaveFormat = (WdSaveFormat) saveFormat;
}

Однако, когда вы попытаетесь запустить этот фрагмент кода в Project 1, во время выполнения все равно потребуется возможность найти копию dll Microsoft.Office.Interop.Word.

2 голосов
/ 14 марта 2012

Лучшее решение - создать свой собственный тип для распределения параметров между библиотеками и проектами.

НЕ требуется, чтобы связи между проектами знали о сторонних библиотеках (если только они не будут тесно связаны таким образом).Гораздо лучше создавать свои собственные типы для маршалирования между библиотеками проектов.Затем принимающий проект (вызываемый) будет преобразован из вашего пользовательского типа в сторонний тип библиотеки.

В этом сценарии Project 1 будет использовать пользовательское перечисление, известное как для проектов 1, так и 2. Project 1 будет использовать этоenum, чтобы поговорить с проектом 2, который переведет его в правильный сторонний тип.

Например (это грубый псевдокод):

public enum SaveFormat
{
    SaveFormat1 = 0,
    SaveFormat2 = 1
};

namespace MyProject1
...
    public void Save()
    {
        MyProject2.SaveDocument( SaveFormat.SaveFormat1 );        
    }

namespace MyProject2
...
    ...
    public void SaveDocument( SaveFormat format )
    {
        WdFormat localFormat = this.Translate( format );        
        ...
    }

    private WdFormat Translate( SaveFormat format )
    {
        switch( format )
        {
            case SaveFormat1:
                return WDFormat1;
            case SaveFormat2:
                return WDFormat2;
            default:
                return WDFormat3;
         }
    }
1 голос
/ 14 марта 2012

Нет, это невозможно. WsSaveFormat определен в Word.Interop, поэтому без добавления ссылки вы не можете использовать в project1. Однако (и имейте в виду, что я не рекомендую это), вы можете определить в вашем проекте2 аналогичное перечисление и позволить проекту1 использовать это перечисление. Конечно, вам нужно сопоставить перечисление с перечислением Word.Interop.

0 голосов
/ 14 марта 2012

Нет, вы используете перечисление WdSaveFormat в проекте 1, поэтому вам нужна ссылка на Microsoft.Office.Interop.Word.

Если вы использовали функцию из проекта 2, которая потребляла другую DLL (например,foo.dll), но явно не использовал ничего из foo.dll в проекте 1, тогда вам не понадобится ссылка на foo.dll в проекте 1.

0 голосов
/ 14 марта 2012

Нет, вы должны добавить ссылку на Microsoft.Office.Interop.Word в Project1, чтобы использовать перечисление, определенное в сборке.Это не будет стоить вам ничего с точки зрения памяти, потому что ваш Project2 в любом случае использует ссылку (а вы используете Project2 в Project1)

0 голосов
/ 14 марта 2012

Лучшее эмпирическое правило, которое я нашел при работе с офисными вещами: не экспортируйте ничего, что раскрывает тип взаимодействия.Единственными открытыми типами должны быть ваши типы, которые обертывают поведение взаимодействия.Насколько мне известно, это хорошее правило для всего стороннего кода.

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