Как получить доступ к классу в пространстве имен, которое находится в другом проекте? - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть три проекта в рамках другого проекта, каждый из которых содержит одно пространство имен. Теперь среди них мне нужно назвать класс, который находится в пространстве имен в Visual Studio 2008. Пожалуйста, не просите меня добавить зависимости к основному проекту, чтобы я мог получить доступ к пространству имен и всем классам в нем, так же, как к локальному пространству имен. что я не могу сделать из-за некоторых ограничений. Скажите мне что-нибудь вроде концепции производного класса, чтобы я мог получить доступ к этому классу.

Класс LanguageTable, который я хочу вызвать, выглядит следующим образом:

#define GFX_LANGUAGE_MAX 20

namespace gfx_viewer_win32
{
  public ref class LanguageTable 
  {
  public:    
     static Dictionary<String ^, List<String ^>^> ^ language_string_table;
     static array<String ^> ^language_string_id;

     LanguageTable(void)
     {
     }
     ~LanguageTable(void)
     {
     }     
  };
}

Место, откуда я хочу вызвать класс LanguageTable, выглядит следующим образом:

#pragma once
using namespace gfx_coder_prj_parser;

namespace Code_generator
{
public ref class CCodeGenerator : CCodeParserMultiLayer
    {
       CCodeGenerator(void)
       {
       }
       ~CCodeGenerator(void)
       {
       }
       /*============I want to call LanguageTable class from here==========*/
    };
}

1 Ответ

0 голосов
/ 14 сентября 2011

Если вы не хотите добавлять сборку класса LanguageTable в качестве ссылки, вы можете связаться с ней по System.Reflection.Сначала загрузите сборку и создайте экземпляр LanguageTable, и теперь вы можете вызывать методы, получать доступ к свойствам, выполняя поиск по их именам, таким как

Assembly ^ langTableAssembly = Assembly::Load("assembly_name" or  binary_data_of_assembly  );
object ^ langTable = langTableAssembly->CreateInstance("gfx_viewer_win32::LanguageTable", ...with_other_params);
Type ^ langTableType = langTable->GetType();
MemberInfo ^ langStringID = langTableType.GetMember("language_string_id")[0];
MethodInfo ^ someMethod = langTableType.GetMethod("method_name");
someMethod->Invoke(langTable, ...other_params);

Хотя это не очень хороший подход.Это зависит от имен, любого изменения имен (с помощью рефакторинга и т. Д.), Вы должны исправить код выше.И я не могу сказать, что это лучшая производительность.

Наконец, после загрузки сборка LanguageTable не будет выгружена во время выполнения программы.Если вы хотите его разгрузить, это еще одна история под названием "игра с Appdomains" .

Здесь и здесь - некоторые ссылкидля начала.

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