KozinM Цитата: Подскажите, как можно запустить код на VBS из под С#? Надо вытащить и поправить некоторую информацию из Active Directory.
В начале топика было какоето-упоминание, но очень вскольз. Пожалуйста подробнее, я только начинаю использовать C#.
либо заюзать контрол ms script control (или как-то так), либо самостоятельно подключить движок vbs в свою программу (больше возможностей, но и сложнее)
во втором случае от программиста требуется заимплементить сайт (IActiveScriptSite) и подсунуть его движку
вот как может выглядеть простейшая имплементация (взято из рабочего кода, удалено все лишнее)
[more]
Код: public class JScriptSite : IActiveScriptSite
{
private Dictionary<String, Object> _interfaceMap = new Dictionary<string,Object>();
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public JScriptSite()
{
}
// добавить именованный объект в пространство движка.
// после добавления объект будет доступен внутри скрипта.
public void AddNamedItem(String s, Object obj)
{
try
{
if (this._interfaceMap.ContainsKey(s))
this._interfaceMap[s] = obj;
else
this._interfaceMap.Add(s, obj);
}
catch (Exception e)
{
log.Error("AddNamedItem: " + e.Message);
}
}
#region IActiveScriptSite Members
public void GetLCID(out uint plcid)
{
plcid = (uint) CultureInfo.CurrentCulture.LCID;
}
public void GetItemInfo(
string pstrName,
uint dwReturnMask,
out object ppiunkItem,
IntPtr ppti)
{
ppiunkItem = null;
if (this._interfaceMap.ContainsKey(pstrName))
{
ppiunkItem = this._interfaceMap[pstrName];
if (ppti != IntPtr.Zero)
{
Marshal.WriteIntPtr(
ppti,
Marshal.GetITypeInfoForType(ppiunkItem.GetType())
);
}
}
}
public void GetDocVersionString(out string pbstrVersion)
{
throw new NotImplementedException();
}
public void OnScriptTerminate(ref object pvarResult, ref EXCEPINFO pexcepinfo)
{
}
public void OnStateChange(uint ssScriptState)
{
}
public void OnScriptError([In, MarshalAs(UnmanagedType.IUnknown)] object pscripterror)
{
EXCEPINFO ei;
IActiveScriptError err = (IActiveScriptError)pscripterror;
err.RemoteGetExceptionInfo(out ei);
log.Warn("OnScriptError: " + ei.bstrDescription);
log.Warn("sCode=" + ei.scode + " wCode=" + ei.wCode);
}
public void OnEnterScript()
{
}
public void OnLeaveScript()
{
}
#endregion
}