我在我的Web应用程序中使用大约15-20个传统的32位C++ COM DLL,其中一些32位DLL具有第三方依赖项,这些依赖项是DLL的COM或本机.
我正在考虑迁移到Windows Azure,我理解这是一个64位平台.任何人都可以建议我的32位DLL是否可行?(我知道现在可以对它们进行regsvr32).
经过一两个星期的工作,我可以将我的DLL重新编译为64位,但是由于我没有源代码,这对于第三方依赖项是不可能的.
我知道Windows Azure使用64位,所以我想知道这里迁移我的应用程序的最佳方法是什么?
即我应该移动32位DLL并依赖WoW64 - 这甚至可以工作吗?我不介意一个小的性能打击.
或者更好的是重新编译我的64位应用程序并以某种方式使用32位DLL?
刷新所有Azure实例中的数据的最佳方法是什么?
我有几个实例,每个实例都运行相同的Web角色.在角色启动时,数据从blob存储读取到本地存储.间歇性地,将对网站使用的数据进行新的更新.我希望能够以编程方式通知每个实例,以便将blob存储中的更新数据导入实例的本地存储,以便每个实例都刷新.
一个想法是编写一个自定义客户端程序来调用Web角色上的Web服务,并传入角色ID进行更新.如果端点是角色ID,则实例将刷新自身.如果不是,则客户端再次尝试,直到所有实例报告它们都被刷新.这是一个很好的方法还是在Azure中有内置方法来执行此操作?
我考虑过一个单独的线程,间歇性地检查刷新标志,但我担心我的实例会变得不同步.
没有大量数据,所以我可以把它放在Azure缓存中.但是,我担心使用缓存的网络延迟.Azure缓存是否能很好地处理这个问题?
另一个想法是一个接一个地重启实例(在角色启动时执行刷新操作).
我有10个XAML文件,每个文件都包含一个动画帧(它们是从SWF转换的,所以每个对象都没有关键帧信息).每个XAML文件都包含一个Canvas,每个帧都有各种形状.
我想创建1个XAML文件,其中包含每个帧的Canvas信息,然后使用XAML在适当的时间显示每个Canvas,因此每个帧都是一个接一个地显示.这是一个好方法吗?我怎样才能做到这一点?我尝试使用Blend,但似乎不可能,因为我的对象在每个帧上都不同(即我不是动画对象属性).
我只是在寻找一个声明性的解决方案.
是否可以在Azure函数中使用In-Proc COM DLL?
我正在将Web服务迁移到Azure Functions。组件之一依赖于旧版32位COM DLL。这通常需要将DLL在将要使用的系统上进行regsvr32编辑。似乎对于Azure Functions而言是不可能的,是否可以使用此类旧版实现?
还是有必要恢复到传统的云服务来支持这一点?(我更喜欢使用“消费”服务计划,并从“无服务器”架构中受益。)
脚步:
错误日志报告异常:
无法加载文件或程序集“ Interop.MyCOMLib,版本= 1.0.0.0,区域性=中性,公共密钥令牌=空”或其依赖项之一。该系统找不到指定的文件。
执行函数时的异常:Legacy Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时的异常:Legacy ---> System.IO.FileNotFoundException:无法加载文件或程序集'Interop.MyCOMLib,Version = 1.0.0.0,区域性= neutral,PublicKeyToken = null”或其依赖项之一。该系统找不到指定的文件。在System.Runtime.CompilerServices.AsyncTaskMethodBuilder的async Functions.Legacy.Run(HttpRequestMessage req,TraceWriter日志)处,在lambda_method(Closure,旧版,对象[]
在异步Microsoft.Azure.WebJobs.Host.Executors.TaskMethodInvoker 2.InvokeAsync(TReflected实例,Object []参数)在Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker 2.InvokeAsync [TReflected,TReturnValue](对象实例,对象异步Microsoft.Azure.Job上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker调用者,ParameterHelper parameterHelper,CancellationTokenSource timeoutTokenSource,CancellationTokenSource functionCancellationTokenSource,布尔throwOnTimeout,TimeSpan timerInterval,IFunctionInstances实例)在异步Web主机上。 .Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstance实例,ParameterHelper parameterHelper,TraceWriter traceWriter,CancellationTokenSource函数CancellationTokenSource)
在异步上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)在异步上Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(??)
另外,如果我转到解决方案的Dependencies | COM然后选择Interop.Lib并选择“嵌入Interop类型”,然后在发布后通过调用已发布的函数进行此更改:
“由于以下错误,检索具有CLSID {D84F92D7-FFFF-4C16-B939-EC98E3A6EBC0}的组件的COM类工厂失败:80040154未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))。”
因此,挑战在于如何向Azure Functions注册COM类?
覆盖 SetParametersAsync 时,如果我调用任何异步方法,则会得到“未处理的异常呈现组件:无法再读取 ParameterView 实例,因为它已过期。ParameterView 只能同步读取,不得存储以备后用。”
public override async Task SetParametersAsync(ParameterView parameters)
{
await Task.Delay(1000);
await base.SetParametersAsync(parameters);
}
Run Code Online (Sandbox Code Playgroud)
我们如何安全地调用 SetParamatersAsync 中的异步方法?
我想通过LINQ查询在每个对象上调用MyMethod,这样做的最佳方法是什么?
目前我正在使用:
.Select(x => { x.MyMethod (); return x; }).ToArray();
Run Code Online (Sandbox Code Playgroud)
立即执行需要ToArray().
有没有更简单的方法来写这个(没有foreach)
谢谢
在构建安装项目时,我收到一条消息:
安装版本错误:错误 27 无法创建文件“C:\Users\MyName\AppData\Local\Temp\VSI1E1A.tmp”“访问被拒绝。”
我尝试了以下(来自http://support.microsoft.com/kb/329214/EN-US)
regsvr32 "C:\Program Files (x86)\Common Files\Microsoft Shared\MSI Tools\mergemod.dll"
Run Code Online (Sandbox Code Playgroud)
DLL 注册,但这并不能解决我的问题。另外,我尝试了清理构建,删除临时文件夹,以管理员身份运行 VS2008,重新启动我的电脑,但每次都会发生。我没有在 Windows 7 64 位上运行和运行的防病毒软件。直到最近,此操作都运行良好。我已经阅读了许多其他用户看到的内容,但没有找到解决方案。
我找到的唯一一半解决方案是编辑设置属性并切换到 Package files as Loose uncompressed files。这有效但并不理想,因为我需要一个完整的安装程序。