Tập tin cấu hình C # DLL


191

Tôi đang cố gắng thêm tệp app.config vào DLL của mình, nhưng tất cả các lần thử đều thất bại.

Theo MusicGenesis trong ' Đưa thông tin cấu hình vào DLL ' thì đây không phải là vấn đề. Vì vậy, rõ ràng là tôi đang làm gì đó sai ...

Đoạn mã sau sẽ trả về ConnectionString của tôi từ DLL của tôi:

return ConfigurationManager.AppSettings["ConnectionString"];

Tuy nhiên, khi tôi sao chép tệp app.config vào ứng dụng bảng điều khiển của mình, nó hoạt động tốt.

Có ý kiến ​​gì không?


Theo bài đăng được đề cập: nếu tên của dll là MyDll.dll, thì tệp cấu hình sẽ là MyDLL.dll.config. Vì vậy, nếu bạn đọc các thiết lập cấu hình từ bên trong dll, nó sẽ tham khảo cấu hình của chính nó phải không?
MegaByte

11
Không quan trọng mã nào yêu cầu - nó đang tìm tệp như được chỉ định cho AppDomain: AppDomain.CienDomain.SetupIn information.ConfigurationFile cài đặt
Marc Gravell

Lưu ý: Câu hỏi "đưa thông tin cấu hình vào DLL" là về việc tách mã cấu hình ứng dụng của bạn vào thư viện để tách biệt với mã ứng dụng chính. Điều này rất khác với một tệp cấu hình riêng biệt và đặc biệt đối với một DLL.
Chris Ammerman

xem bài đăng này [nhập mô tả liên kết tại đây] [1], là giải pháp cho tôi [1]: stackoverflow.com/questions/2389290/
Kẻ

xem bài này [Làm thế nào để tải một tập tin Cài đặt ứng dụng riêng biệt động và hợp nhất với các thiết lập hiện tại?] [1] có thể helpfu [1]: stackoverflow.com/questions/2389290/...
dhailis

Câu trả lời:


277

Việc tạo một tệp cấu hình .NET cho một .DLL không phải là chuyện nhỏ và vì lý do chính đáng. Cơ chế cấu hình .NET có rất nhiều tính năng được tích hợp để hỗ trợ nâng cấp / cập nhật ứng dụng dễ dàng và để bảo vệ các ứng dụng đã cài đặt không chà đạp lên các tệp cấu hình của nhau.

Có một sự khác biệt lớn giữa cách sử dụng DLL và cách sử dụng ứng dụng. Bạn không thể cài đặt nhiều bản sao của một ứng dụng trên cùng một máy cho cùng một người dùng. Nhưng bạn rất có thể có 100 ứng dụng hoặc thư viện khác nhau đều sử dụng một số .NET DLL.

Trong khi hiếm khi cần theo dõi các cài đặt riêng cho các bản sao khác nhau của một ứng dụng trong một hồ sơ người dùng, thì rất có thể bạn sẽ không muốn tất cả các cách sử dụng khác nhau của một DLL để chia sẻ cấu hình với nhau. Vì lý do này, khi bạn truy xuất một đối tượng Cấu hình bằng phương thức "bình thường", đối tượng bạn nhận lại được gắn với cấu hình của Miền ứng dụng bạn đang thực hiện, thay vì lắp ráp cụ thể.

Miền ứng dụng được liên kết với tập hợp gốc đã tải tập hợp mà mã của bạn thực sự nằm trong. Trong hầu hết các trường hợp, đây sẽ là tập hợp của .EXE chính của bạn, là tập tin đã tải lên .DLL. Có thể quay các miền ứng dụng khác trong một ứng dụng, nhưng bạn phải cung cấp rõ ràng thông tin về tập hợp gốc của miền ứng dụng đó là gì.

Do tất cả điều này, quy trình tạo tệp cấu hình dành riêng cho thư viện không thuận tiện. Đó là quy trình tương tự mà bạn sẽ sử dụng để tạo tệp cấu hình di động tùy ý không bị ràng buộc với bất kỳ hội đồng cụ thể nào, nhưng bạn muốn sử dụng lược đồ XML, phần cấu hình và cơ chế thành phần cấu hình của .NET, v.v. Điều này đòi hỏi phải tạo một ExeConfigurationFileMapđối tượng , tải dữ liệu để xác định nơi tệp cấu hình sẽ được lưu trữ và sau đó gọi ConfigurationManager. OpenMappedExeConfigurationđể mở nó thành một Configurationví dụ mới . Điều này sẽ cắt bạn khỏi bảo vệ phiên bản được cung cấp bởi cơ chế tạo đường dẫn tự động.

Nói theo thống kê, có lẽ bạn đang sử dụng thư viện này trong môi trường nội bộ và không chắc bạn sẽ có nhiều ứng dụng sử dụng nó trong bất kỳ một máy / người dùng nào. Nhưng nếu không, có một điều bạn nên ghi nhớ. Nếu bạn sử dụng một tệp cấu hình toàn cầu duy nhất cho DLL của mình, bất kể ứng dụng nào đang tham chiếu đến nó, bạn cần phải lo lắng về xung đột truy cập. Nếu hai ứng dụng tham chiếu thư viện của bạn đang chạy cùng một lúc, mỗi ứng dụng có Configurationđối tượng riêng của chúng mở, thì khi một ứng dụng lưu thay đổi, nó sẽ gây ra ngoại lệ vào lần tới khi bạn cố truy xuất hoặc lưu dữ liệu trong ứng dụng khác.

Cách an toàn và đơn giản nhất để giải quyết vấn đề này là yêu cầu hội đồng đang tải DLL của bạn cũng cung cấp một số thông tin về chính nó hoặc để phát hiện nó bằng cách kiểm tra Miền ứng dụng của cụm tham chiếu. Sử dụng công cụ này để tạo một số loại cấu trúc thư mục để giữ các tệp cấu hình người dùng riêng biệt cho mỗi ứng dụng tham chiếu DLL của bạn.

Nếu bạn chắc chắn muốn có các cài đặt chung cho DLL của mình bất kể nó được tham chiếu ở đâu, bạn sẽ cần xác định vị trí của mình cho nó thay vì .NET tự động tìm ra một vị trí thích hợp. Bạn cũng cần phải tích cực trong việc quản lý quyền truy cập vào tệp. Bạn sẽ cần lưu trữ bộ nhớ cache càng nhiều càng tốt, giữ cho Configurationcá thể xung quanh CHỈ miễn là tải hoặc lưu, mở ngay lập tức trước và xử lý ngay sau đó. Và cuối cùng, bạn sẽ cần một cơ chế khóa để bảo vệ tệp trong khi nó được chỉnh sửa bởi một trong những ứng dụng sử dụng thư viện.


tôi nghĩ rằng cơ chế đồng bộ hóa phải là một "sự kiện được đặt tên", v.v., bởi vì nó là quá trình xuyên suốt
Jacob

8
: / Meh. Chúng tôi là một ứng dụng doanh nghiệp quái vật với .exe chính được viết bởi những kẻ ở một múi giờ khác và các mô-đun được đại diện bởi các DLL khác nhau và được ràng buộc động thông qua một khung plugin tùy chỉnh. Tất cả điều này "bạn sẽ cần đảm bảo nhiều ứng dụng có thể sử dụng đồng thời DLL của bạn" tính chính xác là sai.
JohnL4

Hơn nữa, trong phần lớn sự nghiệp của mình, tôi đã thấy các cơ chế đối tượng chia sẻ chung đáng yêu này hoàn toàn bị bỏ qua, với các nhóm tạo DLL (hoặc JAR) chỉ có thể được sử dụng trong một ngữ cảnh (và phải có mặt, hoặc ứng dụng bị lỗi ). Họ cũng có thể bị ràng buộc tĩnh, nhưng đó là vượt qua.
JohnL4

1
"Nói theo thống kê, có lẽ bạn đang sử dụng thư viện này trong môi trường nội bộ và không chắc bạn sẽ có nhiều ứng dụng sử dụng nó trong bất kỳ một máy / người dùng nào." Sự khác biệt giữa lý thuyết và thực hành đôi khi khiến tôi khá gắt gỏng.
JohnL4

1
@Panzercrisis, tính năng Cài đặt cài đặt của Visual Studio sẽ tự động tạo các đường dẫn cụ thể cho phiên bản cho tất cả các cài đặt của người dùng. Xem: stackoverflow.com/questions/35778528/ khăn
Deantwo

101

nếu bạn muốn đọc các cài đặt từ tệp cấu hình của DLL nhưng không phải từ các ứng dụng gốc web.config hoặc app.config, hãy sử dụng mã bên dưới để đọc cấu hình trong dll.

var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string dllConfigData = appConfig.AppSettings.Settings["dllConfigData"].Value;

Trong C ++ được quản lý cho Hệ thống VS 2008 :: Cấu hình :: Cấu hình ^ appConfig = Cấu hình Trình quản lý :: OpenExeConfiguration (Hội đồng :: GetExecutingAssugging () -> Vị trí); Chuỗi ^ name = appConfig-> AppSinstall-> Cài đặt ["name"] -> Giá trị;
Hans

Cảm ơn, điều này thực sự giải quyết vấn đề của tôi. Tôi đã giải quyết vấn đề này khoảng hai ngày và đến giờ vẫn chưa giải quyết được. Khi gỡ lỗi một bài kiểm tra, Trình quản lý cấu hình đã đọc từ máy.config -Tôi nghĩ-, vì các chuỗi kết nối được rút ra là về chuỗi kết nối SQLE े mà tôi không liệt kê-.
yopez83

19

Tôi đã có cùng một vấn đề và tìm kiếm trên web trong vài giờ nhưng tôi không thể tìm thấy bất kỳ giải pháp nào nên tôi đã tự làm. Tôi tự hỏi tại sao hệ thống cấu hình .net lại không linh hoạt như vậy.

Bối cảnh: Tôi muốn có DAL.dll để có tệp cấu hình riêng cho cơ sở dữ liệu và cài đặt DAL. Tôi cũng cần app.config cho Thư viện doanh nghiệp và các cấu hình riêng của nó. Vì vậy, tôi cần cả app.config và dll.config.

Điều tôi không muốn làm là chuyển qua mọi thuộc tính / cài đặt từ ứng dụng đến lớp DAL của tôi!

để bẻ cong "AppDomain.CienDomain.SetupIn information.ConfigurationFile" là không thể bởi vì tôi cần nó cho hành vi app.config bình thường.

Yêu cầu / quan điểm của tôi là:

  • KHÔNG sao chép thủ công bất cứ thứ gì từ ClassL Library1.dll.config sang WindowsFormsApplication1.exe.config vì điều này không thể áp dụng cho các nhà phát triển khác.
  • duy trì việc sử dụng kiểu gõ mạnh "Properties.Sinstall.Default.NameOfValue" (hành vi cài đặt) vì tôi nghĩ đây là một tính năng chính và tôi không muốn mất nó
  • Tôi phát hiện ra việc thiếu ApplicationSinstallBase để chèn tập tin hoặc quản lý cấu hình tùy chỉnh / riêng của bạn (tất cả các trường cần thiết là riêng tư trong các lớp này)
  • Không thể sử dụng chuyển hướng tệp "configSource" vì chúng tôi sẽ phải sao chép / viết lại ClassL Library1.dll.config và cung cấp một số tệp XML cho một số phần (tôi cũng không thích điều này)
  • Tôi không muốn viết SettingsProvider của riêng mình cho tác vụ đơn giản này như MSDN gợi ý vì tôi nghĩ rằng đơn giản là quá nhiều
  • Tôi chỉ cần phần ứng dụng Cài đặt và ConnectionStrings từ tệp cấu hình

Tôi đã đưa ra cách sửa đổi tệp Settings.cs và thực hiện một phương thức mở ClassL Library1.dll.config và đọc thông tin phần trong trường riêng. Sau đó, tôi đã ghi đè "this [string propertyName]" để cài đặt được tạo.D.Dgingin.cs vào Tài sản mới của tôi thay vì lớp cơ sở. Có các thiết lập được đọc ra khỏi Danh sách.

Cuối cùng có đoạn mã sau:

internal sealed partial class Settings
{
    private List<ConfigurationElement> list;

    /// <summary>
    /// Initializes a new instance of the <see cref="Settings"/> class.
    /// </summary>
    public Settings()
    {
        this.OpenAndStoreConfiguration();
    }

    /// <summary>
    /// Opens the dll.config file and reads its sections into a private List of ConfigurationElement.
    /// </summary>
    private void OpenAndStoreConfiguration()
    {
        string codebase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
        Uri p = new Uri(codebase);
        string localPath = p.LocalPath;
        string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath);
        string sectionGroupName = "applicationSettings";
        string sectionName = executingFilename + ".Properties.Settings";
        string configName = localPath + ".config";
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = configName;
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

        // read section of properties
        var sectionGroup = config.GetSectionGroup(sectionGroupName);
        var settingsSection = (ClientSettingsSection)sectionGroup.Sections[sectionName];
        list = settingsSection.Settings.OfType<ConfigurationElement>().ToList();

        // read section of Connectionstrings
        var sections = config.Sections.OfType<ConfigurationSection>();
        var connSection = (from section in sections
                           where section.GetType() == typeof(ConnectionStringsSection)
                           select section).FirstOrDefault() as ConnectionStringsSection;
        if (connSection != null)
        {
            list.AddRange(connSection.ConnectionStrings.Cast<ConfigurationElement>());
        }
    }

    /// <summary>
    /// Gets or sets the <see cref="System.Object"/> with the specified property name.
    /// </summary>
    /// <value></value>
    public override object this[string propertyName]
    {
        get
        {
            var result = (from item in list
                         where Convert.ToString(item.ElementInformation.Properties["name"].Value) == propertyName
                         select item).FirstOrDefault();
            if (result != null)
            {
                if (result.ElementInformation.Type == typeof(ConnectionStringSettings))
                {
                    return result.ElementInformation.Properties["connectionString"].Value;
                }
                else if (result.ElementInformation.Type == typeof(SettingElement))
                {
                    return result.ElementInformation.Properties["value"].Value;
                }
            }
            return null;
        }
        // ignore
        set
        {
            base[propertyName] = value;
        }
    }

Bạn sẽ phải sao chép ClassL Library1.dll.config từ thư mục đầu ra ClassL Library1 vào thư mục đầu ra của ứng dụng. Có lẽ ai đó sẽ thấy nó hữu ích.


14

Khi sử dụng Trình quản lý cấu hình, tôi khá chắc chắn rằng nó đang tải AppDomaintệp quy trình / cấu hình (app.config / web.config). Nếu bạn muốn tải một tệp cấu hình cụ thể, bạn sẽ phải yêu cầu cụ thể tệp đó theo tên ...

Bạn có thể thử:

var config = ConfigurationManager.OpenExeConfiguration("foo.dll");
config.ConnectionStrings. [etc]

Theo bài đăng được đề cập: nếu tên của dll là MyDll.dll, thì tệp cấu hình sẽ là MyDLL.dll.config. Vì vậy, nếu bạn đọc các thiết lập cấu hình từ bên trong dll, nó sẽ tham khảo cấu hình của chính nó phải không?
MegaByte

1
Không ... tôi không nghĩ vậy. "từ với dll" làm cho không có tỷ lệ cược; theo mặc định, nó đang xem tệp cấu hình được xác định cho AppDomain: my.exe.config
Marc Gravell

1
Cụ thể, cài đặt AppDomain.CienDomain.SetupIn information.ConfigurationFile.
Marc Gravell

lưu ý: Tôi đã thử OpenExeConfiguration và tôi cũng không chắc là nó hoạt động. Có lẽ chỉ cần hợp nhất cấu hình với app.config?
Marc Gravell

có thể được thực hiện ... nhưng không phải với cùng loại hỗ trợ và an toàn như tệp app.config cho EXE. Xem câu trả lời của tôi.
Chris Ammerman

13

Cấu hình Trình quản lý.AppSinstall trả về các cài đặt được xác định cho ứng dụng, không phải cho DLL cụ thể, bạn có thể truy cập chúng nhưng đó là cài đặt ứng dụng sẽ được trả về.

Nếu bạn đang sử dụng bạn từ ứng dụng khác thì ConnectionString sẽ nằm trong ứng dụng cài đặt của ứng dụng.


6

Tôi biết điều này là muộn cho bữa tiệc, tuy nhiên tôi nghĩ tôi sẽ chia sẻ giải pháp tôi sử dụng cho DLL.

Tôi thuộc trường phái tư duy KISS hơn, vì vậy khi tôi có .NET DLL muốn lưu trữ các điểm dữ liệu ngoài kiểm soát cách thức hoạt động hoặc nơi nó đi, v.v. Tôi chỉ cần tạo một lớp "config" chỉ có các thuộc tính công cộng lưu trữ tất cả các điểm dữ liệu cần thiết và tôi muốn có thể kiểm soát bên ngoài DLL để ngăn chặn việc biên dịch lại nó để thực hiện các thay đổi. Sau đó, tôi sử dụng Tuần tự hóa XML của .Net để lưu và tải biểu diễn đối tượng của lớp vào một tệp.

Sau đó, có rất nhiều cách để xử lý việc đọc và truy cập nó, từ Singleton, lớp tiện ích tĩnh, đến các phương thức mở rộng, v.v ... Điều này phụ thuộc vào cách cấu trúc DLL của bạn và phương thức nào sẽ phù hợp nhất với DLL của bạn.


Tôi cũng sử dụng phương pháp này và hài lòng với cách nó đã được thực hiện cho đến nay.
Dave

4

bạn đã đúng, bạn có thể đọc tập tin cấu hình của một dll. Tôi đã vật lộn với điều này trong một ngày cho đến khi tôi phát hiện ra rằng tập tin cấu hình của tôi là vấn đề. Xem mã của tôi dưới đây. nó đã có thể chạy

        ExeConfigurationFileMap map = new ExeConfigurationFileMap();
        map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config";
        Configuration libConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        AppSettingsSection section = (libConfig.GetSection("appSettings") as AppSettingsSection);
        Console.WriteLine(section.Settings["dnd_shortcodes"].Value);

Plugin1.dll.confignhìn của tôi như dưới đây;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <appSettings>
  <add key="cmd_location" value="http://..."/>
  <add key="dnd_shortcodes" value="142,145,146,157,165,167,168,171,173,176,178,404,40"/>
 </appSettings>
</configuration>

Tôi phát hiện ra rằng tập tin cấu hình của tôi thiếu <appSettings>thẻ, vì vậy hãy nhìn xung quanh, vấn đề của bạn có thể khác nhưng không quá xa với tôi.


3

Vì lắp ráp nằm trong bộ đệm tạm thời, bạn nên kết hợp đường dẫn để lấy cấu hình của dll:

var appConfig = ConfigurationManager.OpenExeConfiguration(
    Path.Combine(Environment.CurrentDirectory, Assembly.GetExecutingAssembly().ManifestModule.Name));

thay vì "Path.Combine (Môi trường. Hiện tại, Hội
đồng.GetExecutingAssugging

3

Nếu bạn đang sử dụng các thư viện tìm kiếm một số lượng lớn các thông tin hậu trường, chẳng hạn như WCF, bạn có thể cân nhắc thực hiện việc này:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "MyWcfClientWrapper.dll.config");

Hoặc trong PowerShell:

[AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "MyWcfClientWrapper.dll.config")

IMO kỹ thuật này là một mùi mã và thực sự chỉ phù hợp để sử dụng trong kịch bản ad hoc. Nếu bạn thấy mình muốn làm điều này trong mã sản xuất, có lẽ đã đến lúc đánh giá kiến ​​trúc.

Những điều sau đây KHÔNG được khuyến nghị:
Vì tò mò về kỹ thuật, đây là một biến thể của chủ đề. Bạn có thể tạo một hàm tạo tĩnh bên trong một trong các lớp nằm trong DLL và thực hiện cuộc gọi này từ đó. Tôi không khuyên bạn nên làm điều này ngoại trừ như là phương sách cuối cùng.


3

Giải pháp đầy đủ thường không được tìm thấy ở một nơi ...

1) Tạo tệp cấu hình ứng dụng và đặt tên là "yourDllName.dll.config"
2) Nhấp chuột phải vào tệp cấu hình được tạo ở trên trong VS Solution Explorer, nhấp vào thuộc tính
--- đặt "Xây dựng hành động" = Nội dung
--- đặt "Sao chép vào thư mục đầu ra" = Luôn luôn
3) Thêm phần ứng dụng Cài đặt vào tệp cấu hình (yourDllName.dll.config) bằng yourKeyName và yourKeyValue

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="yourKeyName" value="yourKeyValue"/>
  </appSettings>
</configuration>

4) Thêm System.Configuration vào tài liệu tham khảo dll / class / dự án của bạn
5) Thêm câu lệnh sử dụng vào mã của bạn nơi bạn định truy cập cài đặt cấu hình

using System.Configuration;
using System.Reflection;

6) Để truy cập giá trị

string keyValue = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location).AppSettings.Settings["yourKeyName"].Value;

7) hãy vui mừng, nó hoạt động

IMHO, điều này chỉ nên được sử dụng khi phát triển một thư viện / thư viện mới.

#if (DEBUG && !FINALTESTING)
   string keyValue = ConfigurationManager.OpenExeConfiguration...(see 6 above)
#else
   string keyValue = ConfigurationManager.AppSettings["yourKeyName"];
#endif

Tệp cấu hình kết thúc là một tài liệu tham khảo tuyệt vời, khi bạn thêm cài đặt ứng dụng của dll vào ứng dụng thực tế của bạn.


3

Có vẻ như các tệp cấu hình này thực sự khó hiểu để làm rõ khi hành vi của chúng thay đổi từ môi trường dev sang triển khai. Rõ ràng một DLL có thể có tệp cấu hình riêng, nhưng một khi bạn sao chép và dán dll (cùng với tệp cấu hình của chúng) ở nơi khác, toàn bộ mọi thứ sẽ ngừng hoạt động. Giải pháp duy nhất là hợp nhất thủ công các tệp app.config thành một tệp duy nhất, sẽ chỉ được thực thi bởi người thực thi. Ví dụ: myapp.exe sẽ có tệp myapp.exe.config chứa tất cả các cài đặt cho tất cả các dll được sử dụng bởi myapp.exe. Tôi đang sử dụng VS 2008.


2

Tôi đã tìm thấy những gì có vẻ như là một giải pháp tốt cho vấn đề này. Tôi đang sử dụng VS 2008 C #. Giải pháp của tôi liên quan đến việc sử dụng các không gian tên riêng biệt giữa nhiều tệp cấu hình. Tôi đã đăng giải pháp trên blog của mình: http://tommiecarter.blogspot.com/2011/02/how-to-access-mult Môn-config-files-in.html .

Ví dụ:

Không gian tên này đọc / ghi cài đặt dll:

var x = company.dlllibrary.Properties.Settings.Default.SettingName;
company.dlllibrary.Properties.Settings.Default.SettingName = value;

Không gian tên này đọc / ghi các cài đặt exe:

company.exeservice.Properties.Settings.Default.SettingName = value;
var x = company.exeservice.Properties.Settings.Default.SettingName;

Có một số cảnh báo được đề cập trong bài viết. HTH


1

Như Marc nói, điều này là không thể (mặc dù Visual Studio cho phép bạn thêm tệp cấu hình ứng dụng trong dự án thư viện lớp).

Bạn có thể muốn kiểm tra lớp Lắp ráp có vẻ như có thể tạo các tệp cấu hình lắp ráp.


0

Trong bài đăng này, một vấn đề tương tự đã được thảo luận và giải quyết vấn đề của tôi Làm thế nào để tải một tệp Cài đặt ứng dụng riêng biệt và hợp nhất với các cài đặt hiện tại? có thể là giúp đỡ


Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Adi

0

Đối với một dll, nó không nên phụ thuộc vào cấu hình vì cấu hình được sở hữu bởi ứng dụng chứ không phải bởi dll.

Điều này được giải thích tại đây


0

bạn có thể sử dụng mã này:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace GClass1
{
[Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface _GesGasConnect
{
    [DispId(1)]
    int SetClass1Ver(string version);


}

[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("InterfacesSMS.Setting")]
public class Class1 : _Class1
{
    public Class1() { }


    public int SetClass1(string version)
    {
        return (DateTime.Today.Day);
    }
}
}
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.