2012-07-22 3 views
1

C# 4.0을 사용하고 있습니다..exe 파일을 강력하게 참조하려면 어떻게해야합니까?

Microsoft.VisualStudio.TestTools.UnitTesting을 사용하여 단위 테스트를 실행 중입니다.

UnitTest 프로젝트에서 다른 프로젝트 인 ProjectA를 테스트합니다. 나는 다양한 빈의 내부에 "MPLex.exe"을 배치 한

Process mplex = new Process(); 
psi = new ProcessStartInfo(); 
psi.CreateNoWindow = true; 
psi.UseShellExecute = false; 
psi.RedirectStandardError = true; 
psi.FileName = "cmd.exe"; 
psi.Arguments = "/C mplex omittedForBrevity"; 
mplex.StartInfo = psi; 
mplex.Start(); 

/* This is telling me: "'mplex' is not recognized 
* as an internal or external command, operable 
* program or batch file." */ 
var a = mplex.StandardError.ReadToEnd(); 

, 내 유닛 테스트 프로젝트의 \ 빈 \ 디버그 \ 폴더에있는 "해당 AppDomain.CurrentDomain.BaseDirectory"(포함 : PROJECTA이 같은 프로세스를 생성).

MPLex.exe는 기본적으로 Microsoft의 GPLEX 파생물이며 Flex/Lex의 C# 버전입니다. ProjectA에서 MPLex.exe에 대한 참조를 추가하고 객체 브라우저에서 볼 때 Main과 같은 인터페이스가 표시되지 않거나 인터페이스 방식이 공개되지 않습니다. 그렇지 않으면 cmd 대신 호출 할 것입니다. 나는 위에서 한 것처럼.

제가 생각하기에 단위 테스트를 할 때 \ bin \ Debug \ 디렉토리를 검색하지 않습니다. ProjectA에서 같은 코드를 ProjectB가 아닌 Unit-test의 Main 메서드에서 실행할 때 제대로 작동합니다. 어떻게 든 강력하게 .exe를 참조하면 어디서나 복사 할 수 있기 때문에 문제가 해결 될 것이라고 생각합니다. 어떻게해야합니까?

편집 :이 추가

그것을 해결하지만, 모든 난 그냥이 아직 자체가 알려하지 않은 다른 뭔가를 부러 수 있습니다 알고 있습니다.

System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
+0

그냥 mplex에 대한 참조를 추가 할 수 있습니다 테스트 프로젝트에서? 또한 mstest는 bin에서 테스트를 실행하지 않고 실행하기 전에 배포 디렉토리로 복사합니다. –

+0

테스트 프로젝트에서 MPLex.exe에 대한 참조를 추가하지 않았습니다. 그러나 일단 내가 한 후에도 여전히 효과가 없었습니다. 나는 컴파일러/링커/그들이 무엇을 사용하는지 실제로 결정할 때까지 참조 dll과 exe가 복사되지 않는다고 생각한다. 최소한이 유닛 테스트가 사용하는 \ out \ bin 디렉토리가 아닙니다. –

답변

1

mstest는 bin 밖에서 단위 테스트를 실행하지 않습니다. 테스트 디렉토리와 참조 된 어셈블리를 테스트 배포 폴더 (일반적으로 솔루션 디렉토리의 TestResults)에 복사합니다. 나는 "단위"비슷한 구성 요소를 테스트했고 항상 배치 기능을 사용해야합니다. 이는 너무 단순한 것에 사용하기에 골칫거리지만 여기에 있습니다.

먼저 테스트 설정에 배포가 설정되어 있어야합니다. testsettings 파일로 이동하여 배포 탭을 선택하고 배포 활성화를 클릭합니다. 솔루션 구성 방법에 따라 여기에 mplex 파일을 추가 할 수 있습니다. 우리 프로젝트에서는 필자가 테스트를 위해 필요한 파일이 소스 제어 트리 외부에 존재하고 VS가 불평 할 것이기 때문에 그렇게하지 않습니다.이 경우 아래에서 설명하는 파일 링크를 사용하십시오.

특정 테스트 또는 테스트 클래스에 DeploymentItem 특성을 추가 할 수도 있으며 해당 테스트가 실행될 경우에만 파일이 복사됩니다. 이는 항상 복사하지 않으려는 대용량 데이터 파일 인 경우 유용합니다.

필요한 파일이 테스트 솔루션 외부에있는 경우 필요한 파일을 테스트 프로젝트의 링크로 추가하고 빌드 작업을 항상 복사하도록 설정하십시오. 그런 다음 testsettings의 배포 된 파일에 추가하거나 DeploymentItem 특성을 사용합니다.

1

.exe는 C# 컴파일 된 코드이며 코드의 시작점을 설명하는 추가 헤더가 있다는 점을 제외하면 dll과 유사합니다.

나는 다음 단계를 수행했고 나를 위해 일했다.

1 - 잘 작동 프로젝트 참조와 다음 코드와 같은 다른 클래스 라이브러리 프로젝트에 참조 - 정적 메서드 메인 및 비 정적 메서드

namespace TestConsole1 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Console.Write("hello 1st"); 
     } 

     public void TestMethod2() 
     { 
      Console.Write("hello 2nd"); 
     } 
    } 
} 

2 EXE 파일을 만들었습니다.

TestConsole1.Program prg = new TestConsole1.Program(); 

prg.TestMethod2(); 

또한 exe 이름을 "some.exe"에서 "some.dll"로 변경 한 다음 프로젝트에서 참조하고 잘 작동했습니다.

+0

죄송합니다 일부 코드 태그가 작동하지 않습니다! – Anand

+0

서식이 지정되는 한 "1"입니다. - "1 -"로 변경하고 작동하는 것처럼 보였습니다. 나는 좀 더 우아한 해법을 사용하여 시간을 보내고 싶지 않았다 .... 주요 방법은 공개적으로 접근 할 수 없거나 방금 한 일을 할 것이다. 나는 (어떻게 생각 하는가?) 어떻게 든 .exe를 참조해야하며 메서드 나 클래스는 참조하지 않아야한다. 나는 아마도 그것을 인식하는 링커가 될 필요가 있다고 생각한다. –

1

프로젝트에서 .exe bin을 참조하는 것은 좋지 않은 습관입니다. 나는에 제안 : 사용자 환경 경로 변수에 -set에서 mplex 울어 mplex의 경로를 최저 관련하여 (즉, 귀하의에서 ShellExecute에 인수 명령 줄로 mplex입니다)로 cmd를

관련 문제