2010-12-12 5 views
0

Мне нужно построить программное обеспечение, которое будет читать XML, где будет тегом как:Взаимодействие с другими языками?

<Values type="MyParser.Parser" assembly="parser.dll" /> 

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

Я могу думать только об этом, создавая «exe» и отправляя параметры как «командную строку» и получая выход программы.

Интересно, если это лучший способ сделать это. Это «безопасно»? Есть ли другой способ сделать это? Может ли C# вызывать методы из другой сборки (на другом языке)?

On this page it says что-то о «Вы также можете взаимодействовать с другими языками, через платформы», но я не знаю, что это значит на самом деле.

+1

Сборка не написана на C. exe или dll может быть, но они не являются сборками. – erikkallen

ответ

1

Вы фактически заявляете, что хотите прочитать DLL-файл, а не то, что хотите сделать со значением. Я предполагаю, что вы хотите создать экземпляр типа и вызвать для него какой-либо метод для моего ответа.

Это должно быть довольно легко, если это управляемая DLL, загрузив сборку, используя Type.GetType, затем Activator.CreateInstance. Вы должны определить интерфейс для типа, который вы хотите создать, чтобы вы могли получить хороший сильно типизированный объект для работы. Если вы не можете сделать это, лучшим вариантом будет, вероятно, объявить экземпляр, созданный dynamic, а затем просто вызвать метод, который вы хотите, и позволить DLR сделать это волшебство.

Теперь все становится сложнее, если это неуправляемый код. C и другие процедурные языки не будут иметь понятия типа, который вы можете создать и вызвать методы; поэтому вы не можете использовать ту же абстракцию создания экземпляра объекта. Вам нужно будет различать управляемый и неуправляемый код.

У C# есть DllImport, который вы обычно используете для вызова неуправляемого кода. Однако это не динамично, поэтому вы не можете использовать это, если вы заранее не знаете имена библиотек и процедур.

Вы можете создать решение с помощью DllImport для вызова собственных методов Win32 LoadLibraryEx (для загрузки DLL), затем GetProcAddress, чтобы получить указатель на функцию, которую вы хотите вызвать. Затем вы можете использовать Marshal.GetDelegateForFunctionPointer, чтобы получить делегат C#, который вы можете вызвать. Закончив использовать неуправляемую библиотеку, не забудьте позвонить FreeLibrary.

0

Это очень зависит от того, с чем вы пытаетесь взаимодействовать. Если вы хотите вызвать метод из другой сборки .NET, вы можете просто ссылаться на него (неважно, на что он был написан).

Я не думаю, что можно вызвать произвольный метод через COM, но вы можете объявить все возможные методы (с соответствующими атрибутами Interop), а затем выбрать тот, который вам нужно использовать, в зависимости от значения конфигурации.

Если внешняя сборка не является ни .NET, ни COM, то нет способа напрямую вызвать ее методы.

Наиболее функциональный способ архитектования решения - использовать вызовы веб-сервисов.

0

Классическим источником Interop является следующее:

[System.Runtime.InteropServices.DllImport("opengl32.dll", EntryPoint = "glActiveTexture", ExactSpelling = true)] 
internal extern static void glActiveTexture(int texture); 

Другими словами, статическая процедура glActiveTexture находится в open32.dll двоичном, найденного в пути приложения, с подписью (EntryPoint) glActiveTexture.

Иногда все не так просто. Например:

[System.Runtime.InteropServices.DllImport("opengl32.dll", EntryPoint = "glGetActiveUniform", ExactSpelling = true)] 
internal extern static unsafe void glGetActiveUniform(uint program, uint index, Int32 bufSize, [Out]Int32 length, [Out]int size, [Out]int type, [Out]StringBuilder name); 

Вы можете отметить [Out] перед параметром. Этот атрибут параметра используется для указания, что подпрограмма glGetActiveUniform будет выводить данные по этим переменным, так как они фактически являются указателем, который функция записывает.

Это для введения INTEROP маршаллинг, что означает, что во время выполнения копирования в и из внешних рутинных параметров (т.е .: в [OUT] атрибуты указывает на то, чтобы скопировать из переменной раз подпрограммы, как вышел).

Приведенный выше код был сгенерирован моим приложением, имеющим спецификацию функции (в данном случае OpenGL). Я видел похожие генераторы кода, которые берут заголовок С.

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

0

Вы можете использовать p-invoke для выполнения функций C, экспортируемых из dll.

Смежные вопросы