Làm thế nào để tôi có được đường dẫn của hội đồng mã?


781

Có cách nào để có được đường dẫn cho hội đồng mà mã hiện tại cư trú không? Tôi không muốn đường dẫn của cụm gọi, chỉ là đường dẫn chứa mã.

Về cơ bản kiểm tra đơn vị của tôi cần phải đọc một số tệp kiểm tra xml được đặt tương đối với dll. Tôi muốn đường dẫn luôn luôn giải quyết chính xác bất kể dll thử nghiệm có được chạy từ TestDriven.NET, GUI MbUnit hay cái gì khác không.

Chỉnh sửa : Mọi người dường như đang hiểu sai những gì tôi đang hỏi.

Thư viện kiểm tra của tôi nằm ở nói

C: \ dự án \ myapplication \ daotests \ bin \ Debug \ daotests.dll

và tôi muốn có được con đường này:

C: \ dự án \ myapplication \ daotests \ bin \ Debug \

Ba đề xuất cho đến nay làm tôi thất bại khi tôi chạy từ MbUnit Gui:

  • Environment.CurrentDirectory cung cấp cho c: \ Tệp chương trình \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location cung cấp cho C: \ Tài liệu và Cài đặt \ george \ Cài đặt cục bộ \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location đưa ra giống như trước đây.


102
Đây là giải pháp của bạn: var dir = AppDomain.CienDomain.BaseDirectory;
Jalal El-Shaer

7
Đây phải là giải pháp được chấp nhận. AppDomain.CienDomain.BaseDirectory là cách tiếp cận đúng.
aBetterGamer

Xem liên quan:
find

2
Tôi đến đây để tìm giải pháp cho gói nuget để đọc tệp JSON từ thư mục pacakge của nó. Có vẻ như khi gói nuget được thực thi, "AppDomain.CienDomain.BaseDirectory" trỏ đến thư mục dự án đang chạy chứ không phải thư mục gói nuget. Không ai trong số này dường như nhắm mục tiêu chính xác thư mục gói nuget.
Lucas

@ Không phải vì nó không phải là câu hỏi này (thực tế là khi nó được hỏi, nuget không tồn tại) - hãy thoải mái bắt đầu một câu hỏi mới và ping tôi vào đó nhưng tôi có thể nói với bạn ngay bây giờ nó không thể trong hầu hết các trường hợp. Đối với hầu hết các dự án, thư mục nuget nằm packagescạnh tệp sln. NHƯNG khi bạn biên dịch và phân phối những thứ không có tệp sln và không có thư mục gói. Trong quá trình biên dịch, những thứ cần thiết (nhưng không phải mọi thứ) được sao chép vào thư mục bin. Đặt cược tốt nhất của bạn là sử dụng một kịch bản postbuild để sao chép tệp bạn muốn.
George Mauer

Câu trả lời:


1036

Tôi đã xác định thuộc tính sau khi chúng tôi sử dụng điều này thường xuyên trong thử nghiệm đơn vị.

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Các Assembly.Locationtài sản đôi khi mang đến cho bạn một số kết quả hài hước khi sử dụng NUnit (nơi lắp ráp chạy từ một thư mục tạm thời), vì vậy tôi thích sử dụng CodeBasemang đến cho bạn con đường ở định dạng URI, sau đó UriBuild.UnescapeDataStringloại bỏ File://ngay từ đầu, và GetDirectoryNamethay đổi nó sang định dạng cửa sổ bình thường .


29
Điều này có một vấn đề tôi gặp phải, nếu tên thư mục của bạn là: c: \ My% 20Directory thì Uri.UnescapeDataString sẽ trả về: c: \ Thư mục của tôi Điều này có nghĩa là File.Exists ("c: \ My Directory \ MyFile.txt ") sẽ trả về false vì đường dẫn chính xác thực sự là" c: \ My% 20Directory \ MyFile.txt "Tôi đã gặp điều này khi các đường dẫn SVN của chúng tôi có khoảng trắng trong đó và khi chúng tôi kiểm tra chúng sẽ mã hóa các khoảng trắng.
hàng1

5
Hãy cẩn thận khi bạn sử dụng điều này để kiểm tra File.Exist () vì phương thức này sẽ trả về false trên đường dẫn UNC. Sử dụng câu trả lời của @ Keith thay thế.
AZ.

3
Không biết bạn có thể đặt tĩnh trước khi công khai. Rất vui được biết và tôi nghĩ rằng tôi thích sự dễ đọc hơn
Valamas

5
Lưu ý: điều này không hoạt động với các vị trí mạng (ví dụ: \ REMOT_EPC \ Thư mục)
Muxa

5
Ngoài ra, điều này sẽ không hoạt động nếu thư mục có ký hiệu số '#' trong đó. Dấu hiệu số được cho phép trong tên thư mục và tệp trong Windows.
Huemac

321

Không giúp đỡ à?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );

Hãy xem bản chỉnh sửa của tôi, không, đây có phải là điều kỳ lạ về cách MbUnit thực hiện không?
George Mauer

3
Đặt các tệp xml thành nội dung, được sao chép bằng dll hoặc tài nguyên, đọc từ dll.
Keith

22
Hoặc chỉtypeof(DaoTests).Assembly
SLaks

4
@SLaks @JohnySkovdal @Keith: Này các bạn, sử dụng Assembly.GetExecutingAssembly(). Nó "lấy hội đồng chứa mã hiện đang thực thi" (từ mô tả phương thức). Tôi sử dụng điều này trong AddIn " EntitiesToDTOs " của mình. Xem hộiHelper.cs cho ví dụ thực tế.
kzfabi

4
Có vấn đề với bài đăng của @John Silby, vì có vẻ như nó không hoạt động đối với các đường dẫn UNC ... ví dụ: \ Server \ Folder \ File.ext. Điều này đã làm một mẹo. +1
Blueberry

312

Nó đơn giản như thế này:

var dir = AppDomain.CurrentDomain.BaseDirectory;

11
Đây phải là giải pháp được chấp nhận. AppDomain.CienDomain.BaseDirectory là cách tiếp cận đúng.
aBetterGamer

5
cảm ơn vì đã đưa sự chú ý của tôi trở lại vấn đề này - không chắc là nó có sẵn tại thời điểm tôi đặt câu hỏi không nhưng bây giờ là vậy.
George Mauer

120
Không, điều này là sai. Điều này trả về đường dẫn của ĐIỂM GIỚI THIỆU GỐC không phải là mã hiện đang thực thi. Nếu bạn đã tải một cụm thủ công từ một đường dẫn khác hoặc nếu nó đã được tải từ GAC, nó sẽ trả về kết quả sai. Câu trả lời này là chính xác: stackoverflow.com/a/283917/243557 Vẫn nhanh hơn Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).
nathanchere

9
Trên thực tế, điều này sẽ không hoạt động trong các ứng dụng web nhưng theo như tôi đã thấy thì tính năng tăng cường sau đây sẽ hoạt động với mọi loại ứng dụng:AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
Ilya Chernomordik

4
Điều này là tuyệt vời để kiểm tra đơn vị nếu bạn chỉ muốn nhận đường dẫn bin gốc của tổ hợp thử nghiệm của mình (giả sử, để tiếp cận các tệp dữ liệu phụ trợ trong các thư mục con). Tập hợp kiểm tra là điểm nhập mã của bạn.
MarioDS

68

Giống như câu trả lời của John, nhưng một phương pháp mở rộng ít dài hơn một chút.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Bây giờ bạn có thể làm:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

hoặc nếu bạn thích:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

6
Ý của bạn là assemblythay vì Assembly.GetExecutingAssembly()?
Dude Pascalou

3
Như Dude chỉ ra, bạn đã thông qua một đối số và không sử dụng nó.
Chris Moschini

4
Câu trả lời này chỉ đơn giản là sai cho câu hỏi trong tầm tay. Một phiên bản sửa đổi của câu trả lời này có thể cung cấp cho bạn đường dẫn của một hội đồng nhất định. Tuy nhiên, ở đây, chúng tôi đặc biệt tìm kiếm hội đồng thi hành, và vì vậy việc chuyển qua một hội đồng không có ý nghĩa gì. Một phương pháp mở rộng là công cụ sai cho công việc.
Edward Brey

46

Giải pháp duy nhất hiệu quả với tôi khi sử dụng cổ phiếu CodeBase và UNC Network là:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

Nó cũng hoạt động với các URI bình thường.


5
Đây phải là câu trả lời được chấp nhận. Thật khó chịu khi cơ sở mã mặc định không xử lý đúng cổ phiếu UNC.
Daniel Gilbert

Điều này xảy ra sự cố khi thư mục chứa khoảng trắng và thần biết những nhân vật khác ...
MarioDS

1
Tôi đã sử dụng điều này rất nhiều và đã tìm thấy một kịch bản không thành công: nếu chính dòng mã này là một phần của gói NuGet sau đó được ứng dụng sử dụng! Chúng tôi có thể hỗ trợ kịch bản đó bằng cách thay thế GetExecutingAssembly()bằng GetCallingAssembly().
Timo

@Timo: bạn đã xác minh nếu thay đổi này có tác dụng phụ chưa? Nếu vậy xin vui lòng chỉnh sửa câu trả lời để bao gồm sửa chữa.
Ignacio Soler Garcia

@IgnacioSolerGarcia Đáng buồn là tôi phải báo cáo rằng nó chỉ hoạt động sâu một lớp, tức là không thành công nếu gói NuGet được gọi bởi gói NuGet khác! Bây giờ tôi đang sử dụng cái này (từ một bình luận trên trang này của Chernomordik) : AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory. Phần đầu tiên dành cho các ứng dụng web và phần thứ hai dành cho các ứng dụng khác.
Timo

32

Điều này sẽ hoạt động, trừ khi lắp ráp được sao chép bóng :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

14

Cái này thì sao:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

11

Tôi nghi ngờ rằng vấn đề thực sự ở đây là người chạy thử của bạn đang sao chép tổ hợp của bạn đến một địa điểm khác. Không có cách nào trong thời gian chạy để cho biết tập hợp được sao chép từ đâu, nhưng bạn có thể có thể lật một công tắc để báo cho người chạy thử chạy phần lắp ráp từ vị trí của nó và không sao chép nó vào một thư mục bóng.

Tất nhiên, một công tắc như vậy có thể sẽ khác nhau đối với mỗi người chạy thử.

Bạn đã xem việc nhúng dữ liệu XML của mình làm tài nguyên bên trong tổ hợp thử nghiệm chưa?


+1 để chỉ ra vấn đề với sao chép bóng. Tuy nhiên, thực sự có thể xác định vị trí ban đầu từ Assembly.CodeBase.
tm1

11
AppDomain.CurrentDomain.BaseDirectory

hoạt động với GUI MbUnit.


Điều này hoạt động rất tốt để viết một tệp liên quan đến thư mục gốc trong ứng dụng web asp.net
Philip Pittle

Tôi đã thấy rằng cái này hoạt động tốt nhất nói chung. Chọn nó nếu bạn không chắc chắn.
Erik Bergstedt

10

Tôi tin rằng điều này sẽ làm việc cho bất kỳ loại ứng dụng:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory

1
Các thử nghiệm của tôi cho thấy đây là câu trả lời dễ hiểu nhất, không chỉ bao gồm các ứng dụng web và bảng điều khiển, mà còn các cuộc gọi từ các bài kiểm tra đơn vị và các gói NuGet (lồng vào bất kỳ mức đệ quy nào).
Timo

8

Theo như tôi có thể nói, hầu hết các câu trả lời khác có một vài vấn đề.

Cách chính xác để thực hiện việc này cho một tổ hợp không dựa trên đĩa (trái ngược với dựa trên web), không sử dụng GACed là sử dụng thuộc tính của bộ lắp ráp hiện đang thực thi CodeBase.

Điều này trả về một URL ( file://). Thay vì làm rối tung với thao tác chuỗi hoặc UnescapeDataString, điều này có thể được chuyển đổi với sự phiền phức tối thiểu bằng cách tận dụng thuộc LocalPathtính của Uri.

var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;
var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;
var directoryPath = Path.GetDirectoryName(filePathToCodeBase);

1
Không hoạt động nếu đường dẫn chứa #( EscapedCodeBasehoạt động, nhưng EscopedCodeBase không hoạt động nếu đường dẫn chứa ví dụ %20nguyên văn (là chuỗi ký tự được phép trong đường dẫn Windows)
Martin Ba

Nếu chúng tôi muốn có mã này trong gói NuGet, chúng tôi có thể khắc phục tình huống đó bằng cách thay thế GetExecutingAssembly()bằng GetCallingAssembly().
Timo

8

Còn cái này thì sao ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Sau đó, chỉ cần hack những gì bạn không cần


7
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyPath = assembly.GetFiles()[0].Name;
var assemblyDir = System.IO.Path.GetDirectoryName(assemblyPath);

7

Đây là một cổng VB.NET của mã John Sizable. Visual Basic không phân biệt chữ hoa chữ thường, vì vậy một vài tên biến của anh ta đã va chạm với tên loại.

Public Shared ReadOnly Property AssemblyDirectory() As String
    Get
        Dim codeBase As String = Assembly.GetExecutingAssembly().CodeBase
        Dim uriBuilder As New UriBuilder(codeBase)
        Dim assemblyPath As String = Uri.UnescapeDataString(uriBuilder.Path)
        Return Path.GetDirectoryName(assemblyPath)
    End Get
End Property

6

Trong tất cả những năm này, không ai thực sự đề cập đến điều này. Một mẹo tôi học được từ dự án ApprovalTests tuyệt vời . Mẹo nhỏ là bạn sử dụng thông tin gỡ lỗi trong hội đồng để tìm thư mục gốc.

Điều này sẽ không hoạt động trong chế độ ĐÁNG TIN CẬY, cũng như không bật tối ưu hóa, cũng như trên một máy khác với máy được biên dịch.

Nhưng điều này sẽ giúp bạn có các đường dẫn liên quan đến vị trí của tệp mã nguồn mà bạn gọi nó từ

public static class PathUtilities
{
    public static string GetAdjacentFile(string relativePath)
    {
        return GetDirectoryForCaller(1) + relativePath;
    }
    public static string GetDirectoryForCaller()
    {
        return GetDirectoryForCaller(1);
    }


    public static string GetDirectoryForCaller(int callerStackDepth)
    {
        var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1);
        return GetDirectoryForStackFrame(stackFrame);
    }

    public static string GetDirectoryForStackFrame(StackFrame stackFrame)
    {
        return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar;
    }
}

5

Thư mục hiện tại nơi bạn tồn tại.

Environment.CurrentDirectory;  // This is the current directory of your application

Nếu bạn sao chép tệp .xml với bản dựng, bạn sẽ tìm thấy nó.

hoặc là

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(SomeObject));

// The location of the Assembly
assembly.Location;

điều này sẽ có vấn đề nếu lắp ráp đã được sao chép bóng .
tiêu

+1520! Environment.CurrentDirectoryhoạt động nếu bạn đang sử dụng sự phản chiếu trong lớp tác vụ MSBuild, nơi tập hợp thực thi nằm trong GAC và mã của bạn ở một nơi khác.
quạ Vulcan

4
Nói chung, CurrentDirectory không cho bạn biết nơi thực thi của bạn cư trú. Đó không phải là những gì nó được sử dụng cho. Nó thường xảy ra ở cùng một vị trí với các tệp thực thi, vì vậy rất nhiều lập trình viên không hiểu sự khác biệt. Sau đó, họ cuối cùng tạo ra rắc rối cho một số người dùng cuối mong muốn ứng dụng hiểu cách sử dụng đúng cách của CurrentDirectory.
Bent Tranberg

5

Tôi đã sử dụng Association.CodeBase thay vì Location:

Assembly a;
a = Assembly.GetAssembly(typeof(DaoTests));
string s = a.CodeBase.ToUpper(); // file:///c:/path/name.dll
Assert.AreEqual(true, s.StartsWith("FILE://"), "CodeBase is " + s);
s = s.Substring(7, s.LastIndexOf('/') - 7); // 7 = "file://"
while (s.StartsWith("/")) {
    s = s.Substring(1, s.Length - 1);
}
s = s.Replace("/", "\\");

Nó đã hoạt động, nhưng tôi không còn chắc chắn nó đúng 100% nữa. Trang tại http://bloss.msdn.com/suzcook/archive/2003/06/26/assinstall-codebase-vs-assinstall-location.aspx nói:

"CodeBase là một URL đến nơi tìm thấy tệp, trong khi Vị trí là đường dẫn thực sự được tải. Ví dụ: nếu tập hợp được tải xuống từ internet, CodeBase của nó có thể bắt đầu bằng" http: // " , nhưng Vị trí của nó có thể bắt đầu bằng "C: \". Nếu tệp được sao chép bóng, Vị trí sẽ là đường dẫn đến bản sao của tệp trong thư mục sao chép bóng. Thật tốt khi biết rằng CodeBase không được đảm bảo được đặt cho các cụm trong GAC. Tuy nhiên, vị trí sẽ luôn được đặt cho các cụm được tải từ đĩa. "

Bạn có thể muốn sử dụng CodeBase thay vì Location.


1
@Kiquenet: Rất nhiều mã chỉ để chuyển đổi một URI thành một đường dẫn. Chắc chắn nó có thể được cải thiện. Nhìn vào câu trả lời của Mike Schall hoặc SoMoS. Bạn không nên cố gắng chuyển đổi URI ở cấp chuỗi mà thay vào đó hãy sử dụng các đối tượng phù hợp. OK, thật vụng về khi Association.CodeBase trả về một chuỗi thay vì một đối tượng phù hợp hơn, như URI hoặc FileInfo.
Bảy


2

Tất cả các câu trả lời được đề xuất đều hoạt động khi nhà phát triển có thể thay đổi mã để bao gồm đoạn mã được yêu cầu, nhưng nếu bạn muốn làm điều này mà không thay đổi bất kỳ mã nào bạn có thể sử dụng Process Explorer.

Nó sẽ liệt kê tất cả các dll thực thi trên hệ thống, bạn có thể cần xác định id quá trình của ứng dụng đang chạy của mình, nhưng điều đó thường không quá khó.

Tôi đã viết một mô tả đầy đủ về cách thực hiện điều này cho một dll bên trong II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-ricky-web -người phục vụ/


Lưu ý rằng trước hết, mã trong bài viết khá trung tâm IIS và thứ hai, nó cung cấp cho bạn (tôi tin) tất cả các dll hiện đang được tải , không phải là những gì đang chạy bất cứ lúc nào.
George Mauer

Ví dụ đưa ra liên quan đến iis, nhưng các bước tương tự được áp dụng nếu dll đang chạy trong một quy trình bên ngoài iis. Đó chỉ là vấn đề xác định id quá trình. Tôi sẽ cập nhật bài viết để lưu ý rằng. Cám ơn vì sự gợi ý.
Bryan

2

trong một ứng dụng mẫu windows, bạn chỉ cần sử dụng Application.StartupPath

nhưng đối với các ứng dụng DLL và bảng điều khiển, mã khó nhớ hơn nhiều ...

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"


1

Bạn sẽ nhận được thư mục không chính xác nếu một đường dẫn chứa biểu tượng '#'. Vì vậy, tôi sử dụng một sửa đổi của câu trả lời John Sizable là sự kết hợp UriBuilder.Path và UriBuilder.Fragment:

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}

0

Đây là những gì tôi đã đưa ra. Ở giữa các dự án web, kiểm tra đơn vị (người chạy thử nghiệm nunit và chia sẻ lại) ; Tôi tìm thấy điều này làm việc cho tôi.

Tôi đã tìm kiếm mã để phát hiện cấu hình trong bản dựng Debug/Release/CustomName. Than ôi, #if DEBUG. Vì vậy, nếu ai đó có thể cải thiện điều đó !

Hãy chỉnh sửa và cải thiện.

Lấy thư mục ứng dụng . Hữu ích cho các web root, unittests để có được thư mục của các tập tin thử nghiệm.

public static string AppPath
{
    get
    {
        DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

        while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
                || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            appPath = appPath.Parent;
        }
        return appPath.FullName;
    }
}

Lấy thư mục bin : Hữu ích để thực hiện các hội đồng bằng cách sử dụng sự phản chiếu. Nếu các tập tin được sao chép ở đó do thuộc tính xây dựng.

public static string BinPath
{
    get
    {
        string binPath = AppDomain.CurrentDomain.BaseDirectory;

        if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
            && !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            binPath = Path.Combine(binPath, "bin");
            //-- Please improve this if there is a better way
            //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin.
#if DEBUG
            if (Directory.Exists(Path.Combine(binPath, "Debug"))) 
                        binPath = Path.Combine(binPath, "Debug");
#else
            if (Directory.Exists(Path.Combine(binPath, "Release"))) 
                        binPath = Path.Combine(binPath, "Release");
#endif
        }
            return binPath;
    }
}

0

Điều này sẽ làm việc:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

Tôi đang sử dụng điều này để triển khai các thư viện tệp DLL cùng với một số tệp cấu hình (đây là sử dụng log4net từ trong tệp DLL).


Những gì được fileMapsử dụng cho ở đây?
George Mauer

0

Tôi thấy giải pháp của mình là đủ cho việc lấy lại vị trí.

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;

Đây đã là một trong những câu trả lời được xếp hạng hàng đầu được đề cập rõ ràng trong câu hỏi là một cái gì đó không hoạt động trong tình huống này.
George Mauer

Lời xin lỗi phải bỏ qua mà! Rõ ràng là tôi đã không đọc kỹ.
Tez Wingfield

0

Tôi đã có hành vi tương tự NUnittrong quá khứ. Theo mặc định, NUnitsao chép lắp ráp của bạn vào thư mục tạm thời. Bạn có thể thay đổi hành vi này trong NUnitcài đặt:

nhập mô tả hình ảnh ở đây

Có lẽ TestDriven.NETMbUnitGUI có cùng cài đặt.


-3

Tôi sử dụng điều này để có được đường dẫn đến Thư mục Bin:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

Bạn nhận được kết quả này:

"c: \ users \ ricooley \ Documents \ visual studio 2010 \ Project \ Windows_Test_Project \ Windows_Test_Project \ bin"


6
Tôi không thấy lý do để tránh Path.getDirectoryName tại đây
Max Keller

@MaxKeller Nếu bạn không thấy lý do, điều đó không có nghĩa là nó đúng. Phương thức thay thế này của Path.GetDirectoryName nhanh hơn mười lần.
Ruslan Veselov

-3

Ứng dụng web?

Server.MapPath("~/MyDir/MyFile.ext")

2
@christiandev đây là một câu trả lời nhưng có vẻ như đó là một câu trả lời cho câu hỏi sai. Từ câu hỏi khá rõ ràng rằng đây không phải là một ứng dụng web mà là một hội đồng đang được chạy với MbUnit. Điều đó đang được nói, câu trả lời vẫn chưa thực sự chính xác do sao chép bóng Asp.Net (mặc dù nó có thể hình dung là điều mà ai đó đáp ứng câu hỏi này đang tìm kiếm).
George Mauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.