Вячеслав, огромное спасибо за анализ!
Автор: уни 
от себя могу порекомендовать использовать вместо NumericEvaluation обработчик ExpressionEvaluation.
По правде говоря, сначала я и сам пошёл этим путём. Я хотел сначала реализовать только
IPluginLowLevelEvaluation, без
IPluginMathNumericEvaluation. Тем более что, по моим наблюдениям, НЕ реализовывать
IPluginLowLevelEvaluation совсем нельзя, нужна хотя бы заглушка: SMath ругается, когда пытаешься добавить единицы измерения в выражении, где есть функция плагина "чистого
IPluginMathNumericEvaluation". Но меня напрягало, во-первых, усложнение подготовки численного значения параметров (параметры передаются не как готовое число/строка, а как массив
Term), и во-вторых, то, что это может как-то сказаться на работе SMath: ведь я заставляю SMath безальтернативно производить численное решение подвыражений в аргументах, независимо от режима оптимизации выражения, выбранного пользователем. Ведь, судя по информации о последовательности вычислений, представленной Андреем в теме о разработке плагинов,
ExpressionEvaluation выполняется перед другими, и независимо от метода оптимизации? Я впервые делаю плагин для SMath, да и вообще моё знакомство с .NET исключительно маргинальное, так что я подумал: пусть математикой занимается сама программа, ведь у меня фактически используется просто численная библиотека, а
IPluginMathNumericEvaluation по логике как раз предназначен для этого?
Автор: уни 
Странно, что понадобилась какая-то дополнительная работа с размерностями. Насколько я понимаю, нужно обезразмерить параметры функции на входе и добавить размерность на выходе. Почему так это сложно получилось? Весь код для работы с размерностями должен быть на стороне SMath Studio.
Может потребовать пояснение использование метода UnitsManager.GetCurrentUnitName(). В SMath Studio принято соглашение, что "твёрдая" копия файла расчёта не должна зависеть от локализации. Поэтому существуют стандартные (для программы) идентификаторы для названий математических функций, а также соглашения для разделителей и некоторых других символов. По-видимому, то же касается единиц измерения. Поэтому после численного расчёта к результату в виде строки достаточно добавить (буквально) нужную по документации размерность.
Меня тоже это удивило. По-видимому, в
NumericEvaluation это именно так.
Вначале в этом обработчике я пытался просто использовать выражения типа
new MItem("'J/'mol" ). Но это оказалось неправильным, потому что результат оказывался для программы "непонятным", в локализованной версии отображались английские названия единиц, и вели они себя просто как невстроенные и непривязанные единицы. При использовании для единиц
GetCurrentUnitName() отображение их выправилось, но поведение осталось: программа не воспринимала их как встроенные единицы, если только они не оказывались "базовыми" единицами SI (такими как Кельвины или метры, в отличие от, скажем, Джоулей), да и те не работали, если выражение было сложным (скажем, м^3 или кг/м). И только после последовательного разбиения составных единиц SI на простые, использования
UnitsManager.GetCurrentUnitName() для каждой единицы по отдельности, формирования строки-выражения составной единицы,
Converter.ToMItem() и
Expression.SimplifyEx() получилось то, чего хотелось достичь. При этом в "твёрдой" копии сохраняются именно стандартные единицы, не зависящие от локализации.
Для того, чтобы понять, что так вроде бы "правильно", я посмотрел, как SMath передаёт образмеренные параметры в функцию. Там для любой сложной единицы получается внутреннее разложенное представление в локализованных именах. Я так и сделал.
Я считаю, что просто в
UnitsManager не хватает метода, создающего сразу нормальный
MItem из языконезависимого базового представления, ведь у него есть весь необходимый контекст из файла. Было бы здорово написать что-то типа
UnitsManager.MakeLocaleIndependentUnit("'J/'mol" ), ну, или (если так уж необходимо ограничится только встроенными единицами, учитывая разложение [J] = [kg*m^2/s^2])
UnitsManager.MakeLocaleIndependentUnit("'kg*'m^2/{'s^2*'mol}" ). Это обеспечило бы возможность нормально работать с единицами в
NumericEvaluation() без плясок с бубном. Но это - вопрос расширения функционала к Андрею.
Автор: уни 
Проще всего (и понятней) это делать "вручную" в обработчике ExpressionEvaluation, где доступен экземпляр Store.
Может быть, но с другой стороны, там труднее с числами (я писал выше, что у меня нет полного представления о возможных побочных явлениях этого подхода, а пляски с единицами в
NumericEvaluation, при всей их экзотичности, выглядят "стабильными" без побочных эффектов). Может быть, я ошибаюсь.
Автор: уни 
Проект копировался или создавался мастером? GUID должен быть уникальным. Если копировать шаблон из другого проекта, то нужно заново генерировать GUID, который находится в файле AssemblyInfo.cs. Мастер делает это автоматически.
Мастером. Я использовал в качестве отправной точки Ваш VBNetPlugin, но только как источник кода, а не проекта. Кстати, огромное спасибо! Без этого было бы гораздо труднее получить первое работающее приближение.
Автор: уни 
А вообще, лучше использовать обёртку, которая написана самими авторами (platform-independent.7z). Там есть и пример как ей пользоваться (Example.cs). Наворотили они там предостаточно. Не понимаю зачем нужен такой сложный код, но авторам видней. Достаточно взять их обёртку и совместить с кодом плагина для SMath Studio. Я и автору это же посоветовал, так как видел у них на сайте описание обёртки на c#. Не знаю почему он так долго код ваяет, видимо он решил делать нативную обёртку на C++/CLI по моим примерам, а она в два (и более) раза сложнее, чем то же на c#.
Я думаю, что им нужно делать на C#, несмотря на то, что лично мне этот язык не нравится. Но для данной платформы это - то, что нужно.
Использовать их обёртку не хочу - я в ней не разобрался, пусть сами используют, я просто сделал для них старт. Она какая-то слишком избыточная. Мне кажется, тут всё проще, логика каждой функции чётко прописана в своём классе.