标签: .net-assembly

如何以编程方式检查C ++ DLL文件和C#DLL文件以获取对调试DLLS的引用以自动化测试过程

我已经多次遇到此问题,因此需要将其作为一种自动化方法:

我有多个正在不断构建/更改以供多个项目使用的DLL文件。

我创建了一个C#应用程序,该应用程序检测DLL文件是否存在,如果不存在则警告操作员并杀死该程序。在此C#应用程序中,我希望它也检查以确定它是否是“调试”版本-换句话说,如果在最终用户计算机上运行,​​它将崩溃。

现在,我一直在寻找高处和低处,找到了一些可能的解决方案,但它们全都失败了。

Assembly.LoadFrom(string)不适用于非托管代码。我可以用它来测试托管的DLL文件,而不是C ++的文件。

我以为我可以使用Dependency Walker或类似程序在我的应用程序中运行,以向我提供程序集引用的数据,不幸的是,depends.exe控制台仅输出到一个文件(然后我必须读入每个文件并进行解析它用于我的数据(非常费力depends.exe,而且我必须在项目中包括和DLL文件),此外,它似乎没有输出我真正想要的数据(或者至少我无法制作它)。

也尝试过dumpbin,但我似乎无法使其在我的计算机上运行。

我还发现了一些链接,这些链接应该可以为我提供Dependency Walker的资源。不幸的是,他们都死了。我不认为这很难做,但是无论出于何种原因,我都很难弄清楚如何实现此自动化。

一些源链接对我很有帮助,但没有一个可以解决非托管程序集数据的问题。

c# dll .net-assembly

5
推荐指数
1
解决办法
3971
查看次数

如何在新进程中启动第二个项目的新实例

我正在寻找在单独的类库项目中定义的窗口(WPF)作为新的单独进程.有没有办法做到这一点?

我需要在新进程中启动第二个项目实例,因为当我以这种方式启动它时会占用内存:

secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)

我有一个包含多个项目的解决方案.

  • StartUp项目是WPF app.,输出类型:Windows应用程序(exe文件).
  • 所有其他项目都是WFP应用程序,输出类型:类库(dll文件).

现在我通过以下代码运行"应用程序"(此解决方案中构建为dll的其他项目):

secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)

我想要在新进程中运行应用程序...通常我会使用Process.Start(),但我不能这样,因为它需要exe文件作为agrument我有(并且想要)DLL.

c# process .net-assembly

5
推荐指数
1
解决办法
3644
查看次数

GAC似乎包含两个具有相同名称,版本和公钥令牌的程序集

我目前正盯着这个声称在典型的Azure VM上列出GAC内容的页面.请注意,以下程序集和许多其他程序集列出两次.

AuditPolicyGPManagedStubs.Interop, Version=6.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 TWICE
CustomMarshalers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a TWICE
CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a TWICE
ISymWrapper, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a TWICE
ISymWrapper, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a TWICE
Microsoft.GroupPolicy.AdmTmplEditor, Version=6.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 TWICE
Run Code Online (Sandbox Code Playgroud)

对于这些程序集,似乎有两个不同的程序集具有相同的三元组"name + version + token".

怎么可能?这可能是网页中的错误还是可能的?取决于那些程序集的软件将如何选择它想要的那个?

.net gac .net-assembly

5
推荐指数
1
解决办法
440
查看次数

如何使用XML注释和Doxygen记录C#项目/程序集?

我有一个带有XML注释的C#代码库,并且(由于这个站点)发现Doxygen可以很容易地生成转换代码和注释到HTML和PDF文档中所以我知道如何记录类和其他类型及其内容.

但是如何记录项目/程序集/命名空间?我的代码库有50多个; 他们的责任必须记录在案.

我也希望只对它们使用XML注释.但微软的XML评论手册并没有给我一个如何做到这一点的线索,我也找不到Doxygen文档中的任何线索.

我错过了什么?您如何为C#项目/程序集提供文档?

更新:我现在知道如何使用SHFB.

c# doxygen xml-comments .net-assembly visual-studio

5
推荐指数
1
解决办法
2352
查看次数

我应该依赖动态加载的程序集吗?

我有以下情况.

  • 程序集D包含类Data.
  • 程序集F1包含创建,填充和返回的类Data.
  • 程序集F2包含类,它接受Data作为输入.

诀窍是,所有这些程序集都是插件并动态加载.当然,F1和F2都引用D,但在运行时,所有三个都由主机应用程序加载.

现在如果有人用更新的版本替换D二进制文件会有什么变化呢?

我写了一个测试应用程序,它做了类似的事情,结果如下:

  • 在类Data中添加新字段不会导致异常;
  • 用另一个字段替换现有字段会导致TargetInvocationException包含信息,请求字段不存在

如果.NET跟踪接口调用,我很好.那是因为访问库中未更改的部分只会起作用,如果该部分发生变化,我只会告诉我一个例外.因此它将工作(在接口级别上)或不工作 - 没有未定义的行为.

我的问题:

  • 如何在运行时解析类型 - 特别是在不匹配的程序集版本的情况下?.NET是否跟踪字段/属性/参数/返回值类型和名称?
  • 有没有办法在某些特定版本中强制引用程序集?

.net c# dynamic .net-assembly

5
推荐指数
1
解决办法
120
查看次数

来自嵌入式图像的BitmapSource

我的目标是在WPF窗口上绘制图像"someImage.png",它是嵌入式资源,在重写的OnRender方法中:

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
{
    base.OnRender(drawingContext);            
    drawingContext.DrawImage(ImageSource, Rect);            
}
Run Code Online (Sandbox Code Playgroud)

我找到了将我的图像从资源转换为Stream的代码:

public BitmapSource GetSourceForOnRender()
{
    System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
    Stream myStream = myAssembly.GetManifestResourceStream("KisserConsole.someImage.png");

    // What to do now?

    return //BitmapSource    
Run Code Online (Sandbox Code Playgroud)

}

但是我现在如何获得或创建BitmapSource?

c# wpf bitmapsource embedded-resource .net-assembly

5
推荐指数
1
解决办法
3451
查看次数

C#不能跨程序集边界使用,因为它具有嵌入式互操作类型的泛型类型参数

我用C#(wpf)面对这个错误.这个链接没用

不能跨程序集边界使用,因为它具有嵌入式互操作类型的泛型类型参数

只是为了解释我的程序结构,我可以说:

我正在使用外部公司制作的图书馆.我们可以称之为PCDLRN

在解决方案中,我有一个由我制作的项目,其中包括上一个库中的类型.在我的库中我定义:

public ObservableCollection<PCDLRN.DimensionCmd> obcPcdlrnDimensionCommands = new ObservableCollection<PCDLRN.DimensionCmd>();
Run Code Online (Sandbox Code Playgroud)

为了在我的主程序中使用.简而言之:

PCDLRN-> MYLIB obcPcdlrnDimensionCommands - >我的程序myPcd.obcPcdlrnDimensionCommands

在我的程序中,我想访问前面提到的ObservableCollection,但它没有在标题中给出错误.

在此输入图像描述

--EDIT ---正如所建议的那样,我已经将embedded = true更改为false,因为更改了图片中的prop,但错误仍然存​​在

在此输入图像描述

c# wpf dll compiler-errors .net-assembly

5
推荐指数
1
解决办法
3815
查看次数

如何将加载的程序集提供给C#中的Roslyn工作区

我正在使用运行时代码生成来增强现有流程.我在运行时创建的代码需要访问创建代码的进程已经引用的一些相同的dll.

问题是该进程在某些第三方软件中运行,该软件从资源加载dll并将它们注入我的进程...因此我无法访问磁盘上的dll或外部包装器中包含dll的资源.

因此,我尝试使用我已经在内存中的程序集并将它们提供给Roslyn工作区,我将运行时代码放入其中进行编译.我想我可以尝试使用二进制格式化器来序列化程序集,如此SO: 对装配负载的相反操作(byte [] rawAssembly)

但即使我几乎按原样采用代码:

Assembly yourAssembly = typeof(object).Assembly;
var formatter = new BinaryFormatter();
var ms = new MemoryStream();
formatter.Serialize(ms, yourAssembly);
var reloadedAssembly = Assembly.Load(ms.GetBuffer());
Run Code Online (Sandbox Code Playgroud)

我明白了:

An exception of type 'System.BadImageFormatException' occurred in mscorlib.dll but was not handled in user code
Run Code Online (Sandbox Code Playgroud)

其他搜索结果似乎没有任何改善.

我想做的是:

var assemblyRef = MetadataReference.CreateFromAssembly(typeof(object).Assembly);
mySolution.AddMetadataReference(projectId, assemblyRef);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

.net c# .net-assembly roslyn roslyn-code-analysis

5
推荐指数
1
解决办法
378
查看次数

无法加载文件或程序集Microsoft.Win32.Primitives,Version = 4.0.0.0

我在运行我的Web应用程序时遇到问题.

项目设置是ASP.NET Core Web应用程序(.NET Framework).我好像没有任何Build错误.该项目不仅仅是运行.

System.IO.FileLoadException:'无法加载文件或程序集'Microsoft.Win32.Primitives,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)'

在此输入图像描述

c# fileloadexception .net-assembly visual-studio web

5
推荐指数
1
解决办法
7844
查看次数

如何在.csproj文件中为PackageReference指定targetFramework?

我从VS2017和NuGet依赖项的新PackageReference开始遇到问题。

起初,我为不再需要此多余的packages.config文件而感到兴奋。但是现在我有点失望:

我的某些程序集以Framework 4.0为目标,因为它们也必须能够在XP下运行。其他人没有此限制,并且目标框架为4.6.1。因为没有任何4.0程序集依赖于4.6.1程序集,所以它可以正常工作。只有另一个方向。

大多数程序集使用NLog NuGet包。但是,当使用新的PackageReference选项指定NuGet软件包时,面向框架4.6.1的程序集将始终安装面向.NET 4.5的NLog变体。从那时起,无法再构建依赖于.NET 4.0程序集的其他程序集:

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ Microsoft.Common.CurrentVersion.targets(1987,5):警告MSB3275:主要参考资料为“ Tools,Version = 2.0.0.9180 ,无法解析Culture = neutral,processorArchitecture = MSIL,因为它间接依赖于针对“ .NETFramework,Version = v4.5”框架。这是当前目标框架“ .NETFramework,Version = v4.0”的更高版本。[D:\ Work \ 4.8.0_PackageReference \ Test \ TestApp.csproj]

我想将NLog for .NET 4.0用于所有项目。如果没有packages.config,这真的不可能吗?可以使用targetFramework属性指定所需的框架。但是我找不到新的PackageReference方法来做到这一点。真是难以置信...

.net .net-assembly nuget visual-studio-2017

5
推荐指数
1
解决办法
1707
查看次数