Microsoft Enterprise Library (ссылка на .NetTiers) была нашей проблемой, которая, в свою очередь, ссылалась на более старую версию Unity. Чтобы решить проблему, мы использовали следующее переадресацию привязки в файле web.config:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0-2.0.414.0" newVersion="2.1.505.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Practices.Unity.Configuration" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0-2.0.414.0" newVersion="2.1.505.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
. Кроме того, вам может потребоваться просто обновить корпоративную библиотеку до последней версии.
Как уже упоминалось, вам нужен синтаксический анализатор C для Java - посмотрите на этот ответ: Проект Eclipse CDT
У вас есть несколько подходов:
cpp(1)
), поскольку фактические имена функций могут быть скрыты в конструкциях макросов, а затем извлекаются имена определений функций (для этого потребуется синтаксический анализатор или нет, в зависимости от ограничений, накладываемых на источник файл, который вы хотите отсканировать). В любом случае, это будет сложная задача, и чем больше вы будете ограничивать формат в исходном файле. dlopen(3)
объектный файл (участвующая программа или совместно используемая библиотека) и искать идентификаторы функций. Это также будет утомительно, поскольку вынуждает вас использовать двоичный формат (в основном, ELF), который будет использоваться в качестве целевой архитектуры вашей программы. Это зависит от исполняемого формата и не всегда будет возможно. Более простой подход состоит в том, чтобы пометить эти идентификаторы в источнике (например, аннотации в java) макросом TAG, который расширяется до нуля, и отметить места, где будет происходить идентификатор функции. Например:
#define TAG
void TAG myFunc(int a, int b, int c)
Затем вы можете найти файл для TAG
и извлечь следующий идентификатор.
Язык Java требует, чтобы идентификаторы были включены в исполняемый файл в строковом формате, поэтому вы можете применить самоанализ для получения этой информации, но это не является обязательным требованием в C / C ++. И вся структура иерархии классов также включена в исполняемый файл как статическая структура данных, так что вы можете перемещаться и открывать все иерархии типов Java. Это невозможно в C, поскольку основной целью программирования на C является эффективность. Наличие всей информации о типе, включенной в программу, вынуждает использовать много памяти для описания определений данных, и поэтому она не включена в C / C ++.
В любом случае, вы можете самостоятельно составить список с идентификаторами имен, которые вы физически видите в файлах, так что, вероятно, вам даже не нужно автоматически обрабатывать ваши файлы во время сборки.
Другой простой подход к автоматическому выполнению того, о чем вы просите, - определить макрос:
#define FUNCTION_NAME(typ, name) char name##_string[] = #name; typ name
и использовать его как
FUNCTION_NAME(void, myFunc)(int par1, char *par2, int par3)
{
...
}
, который расширяется до
char myFunc_string[] = "myFunc";
void myFunc(int par1, char *par2, int par3)
{
...
}
, поэтому для каждой функции x
у вас будет статическая строка x_string
с именем в виде строки и заголовком функции, свободным от объявления того, что вы хотите (даже переменная функция)
Кстати, внутри тела функции определен неявный макрос, который расширяется до строки, содержащей имя функции __func__
. Но проблема в том, что его можно использовать только внутри функционального тела.