Share via


VsDebugTargetInfo3.bstrEnv Field

Definition

BSTR containing custom environment variables (DLO_CreateProcess).

public: System::String ^ bstrEnv;
public: Platform::String ^ bstrEnv;
std::wstring bstrEnv;
public string bstrEnv;
val mutable bstrEnv : string
Public bstrEnv As String 

Field Value

Remarks

This field is used to set custom environment variables. Note that bstrEnv should be a null-terminated block of null-terminated strings. You must also pass the DBGLAUNCH_MergeEnv in the LaunchFlags to specify that you want the default system environment variables to be merged with what you are specifying. For more information, see the section about lpEnvironment in the topic CreateProcess.

The following is an example of setting this field correctly.

void LaunchMyProcessesUnderDebugger()  
{  
    processes = new Process[numberOfHostInstances];  
    VsDebugTargetInfo3[] debugTargetInfos = new VsDebugTargetInfo3[numberOfHostInstances];  
    string argumentTemplate = "-arg1 \"{0}\" -arg {1} -arg3 {2}";  
    for (int i = 0; i < count; i++)  
    {  
        string workingDirectory = ...;  
        string arguments = string.Format(argumentTemplate, val1, val2, val3);  

        debugTargetInfos[i] = new VsDebugTargetInfo3();....// create process; we don't already have a process to attach to  
        // create process; we don't already have a process to attach to  

        debugTargetInfos[i].dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_CreateProcess;  
        // attach managed debugger  
        debugTargetInfos[i].guidLaunchDebugEngine = VSConstants.CLSID_ComPlusOnlyDebugEngine;  
        // full path to an exe  
        debugTargetInfos[i].bstrExe = debugTargetInfos[i].bstrCurDir = workingDirectory;  
        debugTargetInfos[i].bstrArg = arguments;  
        debugTargetInfos[i].pStartupInfo = IntPtr.Zero;  

        Dictionary<string, string> environmentVariables = new Dictionary<string, string>();  
        environmentVariables.Add(CustomEnvVar, EnvVarValue);  
        // custom environment variables  
        vdebugTargetInfos[i].bstrEnv = GetEnvironmentString(environmentVariables);  
    }  
    // Merge default environment variables with custom ones above.  
    debugTargetInfos[i].LaunchFlags = (uint)__VSDBGLAUNCHFLAGS2.DBGLAUNCH_MergeEnv;....}  
    VsDebugTargetProcessInfo[] tpi = new VsDebugTargetProcessInfo[numberOfHostInstances];  
    int hr = debugger.LaunchDebugTargets3((uint)numberOfHostInstances, debugTargetInfos, tpi);  
    Marshal.ThrowExceptionForHR(hr);  

    for (int i = 0; i < count; i++)  
    {  
        processes[i] = Process.GetProcessById((int)tpi[i].dwProcessId);  
    }  
}  

private static string GetEnvironmentString(IDictionary<string, string> environment)  
{  
    if (environment == null || environment.Count == 0)  
    {  
        return null;  
    }  
// Collect all the variables as a null delimited list of key=value pairs.  
    StringBuilder result = new StringBuilder();  
    foreach (var pair in environment)  
    {  
        result.Append(pair.Key);  
        result.Append('=');  
        result.Append(pair.Value);  
        result.Append('\0');  
    }  
    // Add a final list-terminating null character. This is sent to native code as a BSTR and no null is added automatically. But the format of the data requires that this be a null-delimited, null-terminated list.  
    result.Append('\0');  
    return result.ToString();  
}  

Applies to