Как удалить конфликты типов с библиотекой и исполняемым файлом, которые ссылаются друг на друга?

У меня есть два разных файла, Foo1.exe и Foo2.dll.

Когда я пытаюсь использовать объект, объявленный в Foo2.dll, в Foo1.exe, все работает как положено.

Когда я пытаюсь использовать объект, объявленный в Foo1.exe, в Foo2.dll, все компилируется, как и ожидалось.

Но когда я пытаюсь передать объект из Foo1.exe в Foo2.dll, Foo1.exe не может скомпилироваться, потому что его тип конфликтует с объектом в Foo2.dll, которого на самом деле нет, но на который ссылается Foo1.exe.

Как сделать так, чтобы Foo2.dll могла ссылаться на Foo1.exe, но типы не вызывали конфликтов при компиляции Foo1.exe?

Фактическое сообщение об ошибке: The type Foo in Foo1.cs conflicts with the imported type Foo in Foo2.cs

Спасибо за любую помощь!


person Gbps    schedule 24.05.2011    source источник


Ответы (1)


Каким-то образом вам удалось заставить Foo1.exe ссылаться на другую копию Foo2.dll, которая не ссылается на Foo1.exe. Потому что компилятор С# не позволит вам делать то, что вы пытаетесь сделать, а именно создавать циклические ссылки.

Так что тот факт, что ваш даже компилируется, является случайностью, и вам следует попробовать другой подход.

Вам необходимо выделить классы, общие для Foo1.exe и Foo2.dll, в третью сборку, Foo3.dll, на которую ссылаются обе. Тогда Foo3.dll не должен ссылаться ни на ни ни на Foo1.exe, ни на Foo2.dll.

person Josh    schedule 24.05.2011
comment
Вероятно, это произошло из-за того, что я немного подделал Foo1.exe и вызвал циклическую ссылку. Что делать, если я не могу удалить класс из Foo1.exe, но хочу передать объекты из Foo1.exe в Foo2.dll без конфликтов? Это вообще возможно? Другими словами, могу ли я что-то сделать с Foo2.dll, чтобы он не вызывал циклическую ссылку? - person Gbps; 24.05.2011
comment
Вы можете определить интерфейс IFoo в Foo2.dll, а затем методы в Foo2.dll принимают IFoo вместо Foo. Затем класс Foo в Foo1.exe реализует IFoo. Таким образом, все, что Foo2 должен знать, это IFoo, и циклическая ссылка не требуется. - person Josh; 24.05.2011
comment
За исключением моих хакерских методов, я не думаю, что смогу просто создать IFoo для Foo2.dll именно так, чтобы Foo в Foo1.exe мог его идеально реализовать. Есть ли способ создать интерфейс Foo, просто отражая все в Foo, не вводя его точно в код? Спасибо! - person Gbps; 24.05.2011
comment
Нет, не совсем. Я думаю, вы понимаете преимущества SOLID на горьком опыте. В краткосрочной перспективе вы можете просто включить Foo2.dll в свой основной проект Foo1.exe. В долгосрочной перспективе вы можете захотеть переписать. (ПРОЧНЫЙ — bit.ly/mGXwLu) - person Josh; 24.05.2011
comment
А, ну спасибо за ответы! Я возьму всю эту информацию и постараюсь подойти к этому вопросу более ТВЕРДО. Спасибо еще раз! - person Gbps; 24.05.2011