C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员相关的知识,希望对你有一定的参考价值。

public static class Class1

public static void Start(string ServerAddress)

//代码区



以上是DLL代码,编译成DLL后,在另一个项目中引用,但引用时后,
Class1.Start("xxx.xxx.com");
在代码里,不会报错,一切正常,但F5执行调试时,就提示Class1未包含Start定义

请大神指教

如果智能提示一切正常,visual studio没有直接给你报错;那表示引用是对的,问题可能在DLL文件上
如果你的解决方案同时包含这两个项目且你的Start方法是后添加的就有可能有这个问题(就是visual studio知道你这个DLL的源代码中包含Start这个方法,所以它不报错,但是你没有重新生成新的DLL,程序执行的时候就报错)
你可以重新编译Class1的DLL、重新引用、重新生成项目试试
参考技术A 1、首先打开A,B项目,然后在解决方案资源管理器中右击B项目选择添加引用,然后选择项目,里面会有A项目的。如果没有打开同时打开AB项目,那就没法引用。 注意,同时打开的意思是,两个项目打开在一个环境中。
2、还有就是A项目已经生成了DLL文件,那么一样,选择添加引用的时候选择浏览选项卡,然后可以选择你自己的.dll文件,或者刚刚不久用过的,那么直接在“最近”选项卡里面会显示。
3、最后就是要在程序上面引用:using 你的库名
参考技术B 有可能你的两个项目是独立的,没集成到vs的同一个解决方案里,应用的dll是直接浏览的dll,那是把dll复制了一份过来
最好在解决方案里把两个项目添加进来,引用的时候引用项目,而不是dll,就可以保证一致了追问

其实我的本意是编译出一个独立的DLL给第三方使用,第三方拿到这个DLL时,只是一个独立的文件,并不是项目

追答

检查.net版本是否一致
一般不可能出现你说的情况。
除非你整个项目放到开源网站大家看代码,否则你说的现象就是空口无凭。
真有你说的现象那是微软的大bug。

参考技术C 类名去掉静态试试,public class Class1本回答被提问者采纳

清理项目后,在另一个项目中从 .proto 重新生成 c# 文件

【中文标题】清理项目后,在另一个项目中从 .proto 重新生成 c# 文件【英文标题】:After clean project regenerating c# files from .proto in another project 【发布时间】:2021-08-13 08:34:26 【问题描述】:

我有两个项目:

    项目托管 gRPC 服务器的代码以及 .proto 文件。 项目充当客户端,但还具有许多其他不同的功能

我希望能够清理和构建我的客户端项目,这取决于自动生成的 .cs 文件。使用 Google.Protobuf 和 Grpc.Net.ClientFactory 从 .proto 文件生成 .cs 文件。

到目前为止,我已经完成了: I added a service reference to my 2. project. 我的 2.project.csproj 看起来像(对于 Example.proto):

<ItemGroup Condition=" '$(TargetFramework)' == 'net48' ">
  <PackageReference Include="Grpc.Core" Version="2.32.0" />
</ItemGroup>    

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
  <PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
  <PackageReference Include="Grpc.Net.ClientFactory" Version="2.32.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net5.0-windows'">
  <PackageReference Include="Grpc.AspNetCore" Version="2.32.0" />
  <PackageReference Include="Grpc.Net.ClientFactory" Version="2.32.0" />
</ItemGroup>

<ItemGroup>
  <PackageReference Include="Google.Protobuf" Version="3.13.0" />
  <PackageReference Include="Grpc.Tools" Version="2.32.0">
    <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
  <Protobuf Include="..\Project_A\Protos\Example.proto" GrpcServices="Client">
    <Link>Protos\Example.proto</Link>
  </Protobuf>
</ItemGroup>

当我现在更改 .protofile 时,客户端 .cs 文件会在路径中生成:

...\2.project\obj\$(ConfigurationName)\$(FrameworkName)\

简单地构建第二个项目时这一切都很好。但是,每当第二个项目进行干净的重建时,.cs 文件就不会再次生成,这让我缺少依赖项。

我猜想在某个地方可以选择在构建开始之前触发 .proto 文件的生成? 或者我应该从清理中排除生成的文件吗? 还是有其他我没有看到的方法来实现这一点?

更新:

我现在将 proto 文件移动到一个单独的项目中,并使用以下语句导入它们:

    <ItemGroup>
        <Protobuf Include="..\Proto_Project\Protos\Example.proto" GrpcServices="Client" OutputDir="Protos" CompileOutputs="false">
            <Link>Protos\Example.proto</Link>
        </Protobuf>
    </ItemGroup>

这种方式是这样工作的,每次我更改 proto 时,它都会在 .cs 中重新转换。 但这是我当前(以及以前,据我所知)问题的根源。每次我重建解决方案时,原型文件都会重新转换为 .cs。问题是这发生在项目编译之后。这会导致缺少依赖项,因为文件在编译时不存在。简单地构建解决方案时,不会重新翻译文件并且一切正常。

如何在重建时阻止 protobuf 编译器运行,或者让他提前运行?

【问题讨论】:

【参考方案1】:

我建议您通过将所有 .proto 文件移动到单独的代码存储库来分离这两个项目。接下来在您的其他项目中使用该存储库并专门为该项目生成原型代码。这样您还可以使用 Protobuf 的向后兼容性属性。

使用 git,您可以使用 git 子模块来做到这一点。您可以在服务器和客户端项目中跟踪 proto 文件 repo 的版本。

【讨论】:

感谢您的建议。那么我应该有一个对 Prtotfile-project 的项目引用,因为该项目的构建应该生成 cs 文件,对吗? 设置 C# 项目我几乎不做,但我上次所做的只是将 proto 文件作为父项目的子文件夹包含在内。作为预构建步骤,在该文件夹中的所有 .proto 文件上调用了 protoc。您可以给 proto repo 一个单独的项目并将其构建为 lib。然而,这不是我所做的。

以上是关于C# 我定义了一个静态类编译成DLL后,在另一个项目中引用这个DLL,但访问不了里面的成员的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio C#,安装应用程序后找不到 DLL

Oracle Dll 加载错误:无法在另一台机器上运行 C# 控制台应用程序

vs2008 自定义控件无法生成dll文件 c#

内部类

转换为 Swift 3 破坏了自定义类编码/解码

在C#中,如何在一个窗体中调用另一个窗体的数据?