2013-10-06 4 views
0

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

Me.Icon = myCommonDll.My.Resources.backup__add__16x16 

Вопрос: Можно ли это сделать как-то, что эти общие ресурсы в myCommonDll будет фактические ресурсы для других проектов в решении, поэтому, когда я нажимаю «Изображение» или «Значок» в окне свойств в дизайнере, я получаю перечисленные изображения или значки, которые присутствуют в myCommonDll.My.Resources и как это сделать?

+0

Вы сделали свой ресурс доступным? – VahiD

+0

Я не знаю, что вы думаете, но в myCommonDll.My.Resources.Images и myCommonDll.My.Resources.Icons есть много файлов. Я установил «Модификаторы доступа» в «Публичный» из связанных списков ссылок, если это то, что вы имеете в виду? –

+0

Да, это было то, что я имею в виду, но после комментирования я понимаю, что даже если вы установите этот модификатор доступа публично, вы не сможете увидеть ресурсы из другого образа проекта, используя ресурс в дизайнере, я думаю, что это невозможно. – VahiD

ответ

1

EDIT: Это в первую очередь для версий VS до VS2008, которые НЕ позволяют изменять модификатор уровня доступа для REsources. Другими альтернативами были внешние инструменты или Reflection, но все же не отображали ресурсы для дизайнера.

Ресурсы DLL доступны во время выполнения довольно легко, но не в дизайнере. Вам нужно написать маленького брокера в DLL для получения изображений по имени. DLL:

Public Class ResMgr 
' depending on what else is in the DLL, can just add to an existing class 
Public Function GetImage(imgName As String) As Image 
     Return My.Resources.ResourceManager.GetObject(imgName) 
End Function 

'' alternatively declare it SHARED eg 
''Public Shared Function/Property GetImage As Image 

End Class 

App:

MyRM = New ResMgr 

thisImg = New Image 
thisImg = MyRM.GetImage(userImg) 

Если вы строите его как Shared метод, это просто:

thisImg = ResMgr.GetImage(userImg) 

Если вы хотите, вы можете разоблачить Enum в DLL для действовать как манифест ресурса:

Public Enum ResImg 
     Image1      ' use the names of the images 
     Backup52 
     Flag_FR 
     Flag_RUS 
     ... 
End Enum 

DLL-функция может либо действовать на ResImg, либо использовать оператор большого размера, либо вы можете использовать [Enum].GetNames для преобразования/получения массива имен ресурса изображения.

+0

Hi Plutonix. Я не вижу в этом никакого смысла, поскольку, если я ссылаюсь на dll и «Импортирует» это как пространство имен, тогда у меня есть доступные изображения при проектировании и времени выполнения, если я знаю точные имена, которые я часто не знаю. Это кажется большим недостатком проектов визуальной студии! –

+0

Фактически это альтернатива публикации ресурсов DLL. Кроме того, в версиях VS до VS 2008 не было модификатора уровня доступа для ресурсов, поэтому у одного остался Reflection или что-то вроде этого, чтобы добраться до них («InternalsVisibleToAttribute' не работал с комбо NET2 и VB). Не знал, какая версия VS у вас была. – Plutonix

+0

ОК, спасибо, я работаю на VS2008. –

0

Редактируйте файл .vbproj и обновите два оператора ниже, добавив общий путь к каталогам ваших общих файлов ресурсов. Удачи!

<Compile Include="<common Dir>\My Project\Resources.Designer.vb"> 
    <AutoGen>True</AutoGen> 
    <DesignTime>True</DesignTime> 
    <DependentUpon>Resources.resx</DependentUpon> 
</Compile> 

<EmbeddedResource Include="<common Dir>\My Project\Resources.resx"> 
    <Generator>VbMyResourcesResXFileCodeGenerator</Generator> 
    <CustomToolNamespace>My.Resources</CustomToolNamespace> 
    <SubType>Designer</SubType> 
    <LastGenOutput>Resources.Designer.vb</LastGenOutput> 
</EmbeddedResource> 
Смежные вопросы