Добавление зависимостей проекта к файлу решения программным путем [дублировать]

В JavaScript тип значения исключительно определяет, будет ли это значение присвоено копией значения или копией-копией.

Примитивные значения всегда назначаются / передаются с помощью copy-копии :

  • null
  • undefined
  • string
  • number
  • boolean
  • символ в ES6

Соединение значения всегда назначаются / передаются с помощью reference-copy

  • объектов
  • массивов
  • function

Например

var a = 2;
var b = a; // `b` is always a copy of the value in `a`
b++;
a; // 2
b; // 3

var c = [1,2,3];
var d = c; // `d` is a reference to the shared `[1,2,3]` value
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]

В приведенном выше фрагменте, поскольку 2 является скалярным примитивом, a содержит одну начальную копию этого значения, а b присваивается другая копия значения , При изменении b вы никоим образом не изменяете значение в a.

Но оба c и d являются отдельными ссылками на одно и то же общее значение [1,2,3], которое является составная величина. Важно отметить, что ни c, ни d больше не «владеют» значением [1,2,3] - оба равны равным равноправным ссылкам на значение. Таким образом, при использовании любой ссылки для изменения (.push(4)) фактического общего значения array, это влияет только на одно общее значение, и обе ссылки будут ссылаться на вновь измененное значение [1,2,3,4].

var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]

// later
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]

Когда мы выполняем присваивание b = [4,5,6], мы ничего не делаем, чтобы повлиять на a, где [1,2,3] все еще ссылается. Для этого b должен быть указателем на a, а не ссылкой на array, но в JS нет такой возможности

function foo(x) {
    x.push( 4 );
    x; // [1,2,3,4]

    // later
    x = [4,5,6];
    x.push( 7 );
    x; // [4,5,6,7]
}

var a = [1,2,3];

foo( a );

a; // [1,2,3,4]  not  [4,5,6,7]

Когда мы проходим аргумент a, он присваивает копию ссылки a на x. x и a - отдельные ссылки, указывающие на то же значение [1,2,3]. Теперь внутри функции мы можем использовать эту ссылку для мутации самого значения (push(4)). Но когда мы выполняем присваивание x = [4,5,6], это никоим образом не влияет на то, где указывается начальная ссылка a, - все еще указывает на значение (теперь измененное) [1,2,3,4].

Чтобы эффективно пройти составное значение (например, array) по копированию значения, вам нужно вручную сделать его копию, чтобы переданная ссылка не все еще указывала на оригинал. Например:

foo( a.slice() );

Составное значение (объект, массив и т. Д.), Которое может быть передано посредством reference-copy

function foo(wrapper) {
    wrapper.a = 42;
}

var obj = {
    a: 2
};

foo( obj );

obj.a; // 42

Здесь obj действует как обертка для скалярное примитивное свойство a. Когда передано foo(..), копия ссылки obj передается и устанавливается в параметр wrapper. Теперь мы можем использовать ссылку wrapper для доступа к общему объекту и обновить его свойство. После завершения функции obj.a вы увидите обновленное значение 42.

Источник

15
задан casperOne 10 December 2010 в 16:20
поделиться

3 ответа

Что-то вроде этого я не тестировал его

получить среду

EnvDTE80.DTE2 pEnv = null;
Type myType = Type.GetTypeFromProgID("VisualStudio.DTE.8.0");          
pEnv = (EnvDTE80.DTE2)Activator.CreateInstance(myType, true);

получить решение.

Solution2 pSolution = (Solution2)pEnv.VS.Solution;

получить проект, который вы хотите

Project pProject = pSolution.Projects[0];

добавить ссылку

pProject.References.Add(string referenceFilePath);
6
ответ дан scott 22 August 2018 в 14:58
поделиться

В CodeProject есть пример.

Функциональность содержится в одном классе elRefManager, а метод вызова - CheckReferences. Код можно посмотреть здесь здесь , выбрав файл elRefManager.cs с левой стороны.

Как видно из статьи, вы можете сделать ...

private void button1_Click(object sender, System.EventArgs e)
{
    int ec;
    ec=elRefManager.CheckReferences(null, new string[] {textBox1.Text});

    if (ec<0)
        MessageBox.Show("An error occurred adding this reference");
    if (ec>0)
        MessageBox.Show("Could not add " + textBox1.Text + 
                    "\nCheck its spelling and try again");
}
2
ответ дан Aaron McIver 22 August 2018 в 14:58
поделиться
  • 1
    Это напрямую связано с тем, что просит Даррен. Он спрашивает, как добавить ссылку на проект программно из add-in , что означает, что он имеет доступ к системе DEV instance / solution / project. Он not спрашивает, как загружать сборку динамически во время выполнения. – casperOne 10 December 2010 в 16:34
  • 2
    Я скажу, что вы должны указать, где в этой статье Даррен может посмотреть на код, чтобы выяснить, как его интегрировать в его надстройку (это внешняя программа, которая обращается к текущей таблице объектов и затем взаимодействует с теми же интерфейсами, в будет). – casperOne 10 December 2010 в 16:35
  • 3
    @casperOne Обновлено соответственно ... – Aaron McIver 10 December 2010 в 16:41

System.Assembly.load Позволяет вам вызывать функции в библиотеке, которые не были созданы с вашей программой.

Если вы хотите добавить ссылку на проект, чтобы его в решении вы могли использовать следующее. В основном то же, что и @Scots.

Я сделал это в макросе, которое является vb, но я уверен, что вы можете получить эту идею

    DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate()
    Dim objProject As EnvDTE.Project
    Dim i As Long
    i = DTE.Solution.Projects.Count
    For Each objProject In DTE.Solution.Projects
        If (objProject.Name() = "csCA") Then
            Dim vsproj As VSLangProj.VSProject
            vsproj = objProject.Object
            vsproj.References.Add("C:\Users\test.dll")
        End If
    Next
1
ответ дан rerun 22 August 2018 в 14:58
поделиться
  • 1
    Почему голос? Это точно , как вы загружаете плагины без использования сторонних библиотек. Assembly.Load, а затем Activator.CreateInstance – jgauffin 10 December 2010 в 16:22
  • 2
    Это не добавит ссылки на решение, оно просто загрузит Assembly для запуска кода. – Daniel DiPaolo 10 December 2010 в 16:22
  • 3
    Некоторые люди просто странные! Я поддержал это - спасибо за ответ. – Darren Young 10 December 2010 в 16:23
  • 4
    Daniel DiPaulo: Как вы думаете, что добавит ссылки во время выполнения (когда дело доходит до добавления)? – jgauffin 10 December 2010 в 16:29
  • 5
    @jgauffin: добавление ссылки и загрузка сборки - это две полностью разные вещи. Даррен спрашивает, как добавить ссылку, а не загружать сборку. – casperOne 10 December 2010 в 16:36
Другие вопросы по тегам:

Похожие вопросы: