当“混合模式组合”和“单独的互操作”版本提供第三方组件时,每个组件的优点和缺点是什么?

一个很好的例子是System.Data.SQLite.

以上链接有这样的说法:

[Mixed-mode assembly] packages should only be used in cases where the assembly binary must be deployed to the Global Assembly Cache for some reason.

但为什么?混合模式组合似乎在我的项目中工作正常,没有GAC安装(只是xcopy到应用程序的exe目录).很少有一个更少的DLL.感觉更整洁那么有什么缺点呢?

反之亦然,为什么/应该有人喜欢两个DLL“native-dll interop-dll”版本?

disclaimer: For a definite answer,you’d have to ask someone from the development team,but here’s my best guess.

在标准配置中,托管程序集将尝试查找并加载其所需的本机DLL.它将在平台相关的目录(x86或x64)中进行搜索.然后它将加载它找到的DLL,并继续在其上抛出P / Invoke互操作.

这是一个相当标准的过程,与.NET中的本地库进行互操作 – 唯一的自定义System.Data.sqlite代码是尝试查找DLL并加载正确版本的代码.其余的是P / Invoke.但是,即使这是在处理图书馆时常见的做法.

这种方法的主要优点是图书馆用户可以为Anycpu平台构建他的项目,并且处理器体系结构将在运行时解决 – 如果您在x86或x64上运行,则所有内容都将按预期运行,前提是两个本机DLL都可用.图书馆作者获得的支持请求较少.

我们将其与混合模式方法进行比较.混合模式DLL有一些缺点,主要的是它必须是平台特定的.所以如果你选择这种方法,你必须把你的应用程序绑定到一个特定的平台.如果要同时支持x86和x64,则必须构建单独的版本,每个版本链接到正确版本的System.Data.sqlite.

如果你没有完全正确的话,那么繁荣.更糟糕的是,如果您在x64开发机器上为Anycpu平台构建它,那么它首先看起来就会正常工作,但是它会破坏客户的旧x86盒子.处理这种问题不是很好,使用单独的DLL的简单解决方案完全解决了这个问题.

我可以想到的另一个缺点是无法从内存加载程序集,但这应该是最小的不便之处,因为这也适用于本机DLL.

对于GAC,我的猜测是,在单独的本机程序集的情况下,搜索它们的代码在某些情况下可能无法找到它们,或者可以找到不同版本的DLL. System.Data.sqlite中的代码尝试很难找到本机DLL,但混合模式DLL首先没有这样的问题,所以失败不是一个选项.

不过,你说:

It feels tidier.

我们来仔细看看这个.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

.net – 给定选择,混合模式程序集与单独的互操作DLL的优缺点是什么?的更多相关文章

  1. .net – 给定选择,混合模式程序集与单独的互操作DLL的优缺点是什么?

    当“混合模式组合”和“单独的互操作”版本提供第三方组件时,每个组件的优点和缺点是什么?混合模式组合似乎在我的项目中工作正常,没有GAC安装.很少有一个更少的DLL.感觉更整洁那么有什么缺点呢?

  2. ios – 使用Multiply混合模式覆盖UIImageViews?

    我有2个UIImageViews显示在彼此之上.其中一个可以使用手势识别器拖动.有没有一种方法可以使用像Multiply这样的混合模式渲染ImageViews?

  3. c# – 使用混合模式颜色在另一个图像上绘制图像

    在Photoshop中,您可以选择“颜色”将混合模式设置为下一个较低层:如果图像顶部只有一个渐变,结果可能如下所示:我在某处找到的颜色混合模式的描述是:颜色将下层的色调和饱和度改变为上层的色调和饱和度,但仅留下亮度.到目前为止我的代码是:但那是–当然–只是在较低的图像上绘画.所以问题是:如何使用Photoshop中提供的混合模式“颜色”在另一个图像上绘制图像?

  4. 混合模式程序集(C/C++LI项目)是否可以在.NET Core上运行?

    我有一个使用C/C++LI项目的代码库,它通过瘦包装类将C类暴露给CLR.例如…C项目中的C代码混合模式程序集中的C/C++LI代码据我所知,混合模式程序集几乎只能在Windows.NET上运行.我希望我不需要重新考虑组件并使用P/Invoke,这将为我提供跨平台支持.有谁知道.NETCore是否支持混合模式程序集?

  5. 如何在Cocos2D 1.0 中掩饰一个精灵(三)

    hopy;)尝试编译运行,在你每一次点击屏幕的时候,你将看到我可爱的妻子制作的随机日历图片:现在我们的app里已经有了像样的框架了,让我们开始实现掩饰效果吧!

  6. cocos2dx  混合模式

    如果学习过OpenGL,就知道里面使用glBlendFunc函数实现的。在cocos2d-x里肯定也有,对于精灵,可以使用mySprite->setBlendFunc()来现。下面举一个例子:[cpp]viewplaincopy//////////////////////////////backgroundCCSprite*helloSprite=CCSprite::create;helloSprite->setPosition;this->addChild;///////////////////////

  7. 制作新手引导高亮区域方法之一:混合模式

    demo下载:Quick-x-HighlightArea-master.zip1、混合模式(1)首先创建一个全屏的CCRenderTexture实例这里使用的黑色0.6的透明度,看起来的效果就是一层黑色半透明的遮罩叠在游戏界面上面:1234localpRt=CCRenderTexture:create(size.width,size.height)localcolor=ccc3(0,0)--黑色l

  8. cocos2d粒子系统--粒子编辑器Parti…

    CCParticleSystemQuad方形粒子系统,在3代以后的机器上运行的比较快,他会消耗更多的内存和cpu。使用预处理器ARCH_OPTIMAL_PARTICLE_SYstem来定义粒子系统,在代码编译过程中来判断使用哪一个粒子系统。会自动的根据机型选择合适的粒子系统例:@interfaceCCParticleExplosion:ARCH_OPTIMAL_PARTICLE_SYstem2、有关粒子贴图粒子贴图必须小于64x64的,越小越好。好了,下一步我们就来学习下粒子工具ParticleDesig

  9. APP三种开发模式--及---HybridApp解决方案_No1_混合模式(Hybrid)App开发概述

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. html5 – Chrome中的Chrome css3混合混合模式错误

    我有两个重叠的叠加层,叠加的部分使用混合混合模式混合.在chrome中应用了效果但是使用此属性的div有奇怪的闪烁.这是闪烁的原因以及如何解决.我已经在firefox上测试了它的良好运行但不是在chrome中.Screenshot上面的图像是一旦动画结束,一旦完成,左边的div开始连续闪烁.解决方法我有这个问题,发现它似乎是由混浊与混合混合模式的组合引起的.解决方案是添加一个将改变的规则:不透明度

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部